diff --git a/TUnit.Aspire/AspireFixture.cs b/TUnit.Aspire/AspireFixture.cs index 3c2eb71ba2..43efba8bb3 100644 --- a/TUnit.Aspire/AspireFixture.cs +++ b/TUnit.Aspire/AspireFixture.cs @@ -169,7 +169,7 @@ protected virtual async Task WaitForResourcesAsync(DistributedApplication app, C case ResourceWaitBehavior.AllHealthy: { var model = app.Services.GetRequiredService(); - var names = model.Resources.Select(r => r.Name).ToList(); + var names = GetWaitableResourceNames(model); await WaitForResourcesWithFailFastAsync(app, notificationService, names, waitForHealthy: true, cancellationToken); break; } @@ -177,7 +177,7 @@ protected virtual async Task WaitForResourcesAsync(DistributedApplication app, C case ResourceWaitBehavior.AllRunning: { var model = app.Services.GetRequiredService(); - var names = model.Resources.Select(r => r.Name).ToList(); + var names = GetWaitableResourceNames(model); await WaitForResourcesWithFailFastAsync(app, notificationService, names, waitForHealthy: false, cancellationToken); break; } @@ -523,6 +523,32 @@ private async Task CollectResourceLogsAsync( return string.Join(Environment.NewLine, lines); } + private List GetWaitableResourceNames(DistributedApplicationModel model) + { + var waitable = new List(); + List? skipped = null; + + foreach (var r in model.Resources) + { + if (r is IResourceWithoutLifetime) + { + skipped ??= []; + skipped.Add(r.Name); + } + else + { + waitable.Add(r.Name); + } + } + + if (skipped is { Count: > 0 }) + { + LogProgress($"Skipping {skipped.Count} resource(s) without lifecycle: [{string.Join(", ", skipped)}]"); + } + + return waitable; + } + private sealed class ResourceLogWatcher(CancellationTokenSource cts) : IAsyncDisposable { public ValueTask DisposeAsync()