test: per-test очистка документов через IntegrationTestBase (CloseAllAsync)

Базовый класс IntegrationTestBase (IAsyncLifetime) закрывает все открытые
документы КОМПАС после КАЖДОГО теста (DocumentService.CloseAllAsync) — чтобы не
копились вкладки-пустышки и упавший Assert не оставлял открытый документ. Все
интеграционные тест-классы переведены на него (: base(fx)); индивидуальные
finally CloseAsync сохранены как первичная очистка.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-05-27 13:38:48 +03:00
parent 5e6d3ec8ae
commit 8afad88241
17 changed files with 71 additions and 30 deletions
@@ -64,6 +64,26 @@ public sealed class DocumentService
=> _dispatcher.InvokeAsync(() => WithActive(d =>
d.Close(save ? DocumentCloseOptions.kdSaveChanges : DocumentCloseOptions.kdDoNotSaveChanges)), ct);
/// <summary>
/// Закрыть ВСЕ открытые документы без сохранения; возвращает число закрытых. Применяется для
/// очистки между тестами, чтобы не накапливались вкладки-пустышки. Закрываем активный документ
/// в цикле (после закрытия активным становится следующий) с защитой от зацикливания: если очередной
/// документ закрыть не удалось, прекращаем, чтобы не крутить впустую на одном и том же.
/// </summary>
public Task<int> CloseAllAsync(CancellationToken ct = default)
=> _dispatcher.InvokeAsync(() =>
{
int closed = 0;
for (int guard = 0; guard < 256; guard++)
{
var doc = _session.Application.ActiveDocument;
if (doc is null) break;
try { doc.Close(DocumentCloseOptions.kdDoNotSaveChanges); closed++; }
finally { ComHelper.Release(doc); }
}
return closed;
}, ct);
private void WithActive(Action<IKompasDocument> action)
=> WithActive(d => { action(d); return true; });