diff --git a/CHANGELOG.md b/CHANGELOG.md index e74c53fc0..79dcaf6ce 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -98,6 +98,8 @@ List of new features. By [@egil](https://github.com/egil) in [#288](https://github.com/egil/bUnit/pull/288). +- Added support for registering services in bUnits `Services` collection that implements `IAsyncDisposable`. Suggested by [@jmaillet](https://github.com/jmaillet) in [#249](https://github.com/egil/bUnit/issues/249). + ### Changed List of changes in existing functionality. diff --git a/src/bunit.core/TestServiceProvider.cs b/src/bunit.core/TestServiceProvider.cs index 870e5a1ac..10b105f07 100644 --- a/src/bunit.core/TestServiceProvider.cs +++ b/src/bunit.core/TestServiceProvider.cs @@ -13,7 +13,7 @@ public sealed class TestServiceProvider : IServiceProvider, IServiceCollection, { private readonly IServiceCollection _serviceCollection; private ServiceProvider? _serviceProvider; - + /// /// Gets whether this has been initialized, and /// no longer will accept calls to the AddService's methods. @@ -78,7 +78,14 @@ public object GetService(Type serviceType) /// public void Dispose() { - _serviceProvider?.Dispose(); + if (_serviceProvider is null) return; + + var disposedTask = _serviceProvider.DisposeAsync().AsTask(); + + if (!disposedTask.IsCompleted) + disposedTask.GetAwaiter().GetResult(); + + _serviceProvider.Dispose(); } /// diff --git a/tests/bunit.core.tests/TestServiceProviderTest.cs b/tests/bunit.core.tests/TestServiceProviderTest.cs index 8947479c7..153117a49 100644 --- a/tests/bunit.core.tests/TestServiceProviderTest.cs +++ b/tests/bunit.core.tests/TestServiceProviderTest.cs @@ -7,7 +7,7 @@ namespace Bunit { - public class TestServiceProviderTest + public partial class TestServiceProviderTest { class DummyService { } class AnotherDummyService { } diff --git a/tests/bunit.core.tests/TestServiceProviderTest.net5.cs b/tests/bunit.core.tests/TestServiceProviderTest.net5.cs new file mode 100644 index 000000000..5b0d43c6e --- /dev/null +++ b/tests/bunit.core.tests/TestServiceProviderTest.net5.cs @@ -0,0 +1,28 @@ +#if NET5_0 +using System; +using System.Threading.Tasks; +using Microsoft.Extensions.DependencyInjection; +using Shouldly; +using Xunit; + +namespace Bunit +{ + public partial class TestServiceProviderTest + { + [Fact(DisplayName = "Can correctly dispose of async disposable service")] + public void Net5Test001() + { + var sut = new TestServiceProvider(); + sut.AddScoped(); + sut.GetService(); + + Should.NotThrow(() => sut.Dispose()); + } + + class AsyncDisposableService : IAsyncDisposable + { + public ValueTask DisposeAsync() => ValueTask.CompletedTask; + } + } +} +#endif