diff --git a/framework/src/Volo.Abp.AspNetCore.TestBase/Volo/Abp/AspNetCore/TestBase/AbpAspNetCoreAsyncIntegratedTestBase.cs b/framework/src/Volo.Abp.AspNetCore.TestBase/Volo/Abp/AspNetCore/TestBase/AbpAspNetCoreAsyncIntegratedTestBase.cs index 06a46897fa..3f5e9ad4b8 100644 --- a/framework/src/Volo.Abp.AspNetCore.TestBase/Volo/Abp/AspNetCore/TestBase/AbpAspNetCoreAsyncIntegratedTestBase.cs +++ b/framework/src/Volo.Abp.AspNetCore.TestBase/Volo/Abp/AspNetCore/TestBase/AbpAspNetCoreAsyncIntegratedTestBase.cs @@ -14,9 +14,9 @@ using Volo.Abp.Modularity; namespace Volo.Abp.AspNetCore.TestBase; public class AbpAspNetCoreAsyncIntegratedTestBase - where TModule : AbpModule + where TModule : IAbpModule { - protected IHost Host { get; set; } + protected WebApplication WebApplication { get; set; } protected TestServer Server { get; set; } @@ -50,26 +50,20 @@ public class AbpAspNetCoreAsyncIntegratedTestBase }); await ConfigureServicesAsync(builder.Services); + WebApplication = builder.Build(); + await WebApplication.InitializeApplicationAsync(); + await WebApplication.StartAsync(); - var app = builder.Build(); - - await app.InitializeApplicationAsync(); - - await app.StartAsync(); - - Host = app.Services.GetRequiredService(); - - Server = Host.GetTestServer(); - Client = Host.GetTestClient(); + Server = WebApplication.Services.GetRequiredService().GetTestServer(); + Client = Server.CreateClient(); ServiceProvider = Server.Services; - ServiceProvider.GetRequiredService().Server = Server; } - public virtual Task DisposeAsync() + public virtual async Task DisposeAsync() { - return Task.CompletedTask; + await WebApplication.DisposeAsync(); } protected virtual Task ConfigureServicesAsync(IServiceCollection services) diff --git a/framework/src/Volo.Abp.AspNetCore.TestBase/Volo/Abp/AspNetCore/TestBase/AbpAspNetCoreIntegratedTestBase.cs b/framework/src/Volo.Abp.AspNetCore.TestBase/Volo/Abp/AspNetCore/TestBase/AbpAspNetCoreIntegratedTestBase.cs index 1fa62b2417..f3e60979bb 100644 --- a/framework/src/Volo.Abp.AspNetCore.TestBase/Volo/Abp/AspNetCore/TestBase/AbpAspNetCoreIntegratedTestBase.cs +++ b/framework/src/Volo.Abp.AspNetCore.TestBase/Volo/Abp/AspNetCore/TestBase/AbpAspNetCoreIntegratedTestBase.cs @@ -17,8 +17,6 @@ public abstract class AbpAspNetCoreIntegratedTestBase : AbpTestBaseWit protected HttpClient Client { get; } - protected override IServiceProvider ServiceProvider { get; } - private readonly IHost _host; protected AbpAspNetCoreIntegratedTestBase() diff --git a/framework/src/Volo.Abp.TestBase/Volo/Abp/AbpTestBaseWithServiceProvider.cs b/framework/src/Volo.Abp.TestBase/Volo/Abp/AbpTestBaseWithServiceProvider.cs index 6167d823cb..407660e854 100644 --- a/framework/src/Volo.Abp.TestBase/Volo/Abp/AbpTestBaseWithServiceProvider.cs +++ b/framework/src/Volo.Abp.TestBase/Volo/Abp/AbpTestBaseWithServiceProvider.cs @@ -5,7 +5,7 @@ namespace Volo.Abp; public abstract class AbpTestBaseWithServiceProvider { - protected abstract IServiceProvider ServiceProvider { get; } + protected IServiceProvider ServiceProvider { get; set; } protected virtual T GetService() { diff --git a/framework/src/Volo.Abp.TestBase/Volo/Abp/Testing/AbpAsyncIntegratedTest.cs b/framework/src/Volo.Abp.TestBase/Volo/Abp/Testing/AbpAsyncIntegratedTest.cs new file mode 100644 index 0000000000..4238a8712b --- /dev/null +++ b/framework/src/Volo.Abp.TestBase/Volo/Abp/Testing/AbpAsyncIntegratedTest.cs @@ -0,0 +1,70 @@ +using System; +using System.Threading.Tasks; +using Microsoft.Extensions.DependencyInjection; +using Volo.Abp.Modularity; + +namespace Volo.Abp.Testing; + +public class AbpAsyncIntegratedTest : AbpTestBaseWithServiceProvider + where TStartupModule : IAbpModule +{ + protected IAbpApplication Application { get; set; } + + protected IServiceProvider RootServiceProvider { get; set; } + + protected IServiceScope TestServiceScope { get; set; } + + public virtual async Task InitializeAsync() + { + var services = await CreateServiceCollectionAsync(); + + await BeforeAddApplicationAsync(services); + var application = await services.AddApplicationAsync(await SetAbpApplicationCreationOptionsAsync()); + await AfterAddApplicationAsync(services); + + RootServiceProvider = await CreateServiceProviderAsync(services); + TestServiceScope = RootServiceProvider.CreateScope(); + await application.InitializeAsync(TestServiceScope.ServiceProvider); + ServiceProvider = application.ServiceProvider; + Application = application; + + await InitializeServicesAsync(); + } + + public virtual async Task DisposeAsync() + { + await Application.ShutdownAsync(); + TestServiceScope.Dispose(); + Application.Dispose(); + } + + protected virtual Task CreateServiceCollectionAsync() + { + return Task.FromResult(new ServiceCollection()); + } + + protected virtual Task BeforeAddApplicationAsync(IServiceCollection services) + { + return Task.CompletedTask; + } + + protected virtual Task> SetAbpApplicationCreationOptionsAsync() + { + return Task.FromResult>(_ => { }); + } + + protected virtual Task AfterAddApplicationAsync(IServiceCollection services) + { + return Task.CompletedTask; + } + + protected virtual Task CreateServiceProviderAsync(IServiceCollection services) + { + return Task.FromResult(services.BuildServiceProviderFromFactory()); + } + + protected virtual Task InitializeServicesAsync() + { + return Task.CompletedTask; + } +} diff --git a/framework/src/Volo.Abp.TestBase/Volo/Abp/Testing/AbpIntegratedTest.cs b/framework/src/Volo.Abp.TestBase/Volo/Abp/Testing/AbpIntegratedTest.cs index bb085f6f74..b6ff2b8dbe 100644 --- a/framework/src/Volo.Abp.TestBase/Volo/Abp/Testing/AbpIntegratedTest.cs +++ b/framework/src/Volo.Abp.TestBase/Volo/Abp/Testing/AbpIntegratedTest.cs @@ -9,8 +9,6 @@ public abstract class AbpIntegratedTest : AbpTestBaseWithService { protected IAbpApplication Application { get; } - protected override IServiceProvider ServiceProvider => Application.ServiceProvider; - protected IServiceProvider RootServiceProvider { get; } protected IServiceScope TestServiceScope { get; } @@ -29,6 +27,7 @@ public abstract class AbpIntegratedTest : AbpTestBaseWithService RootServiceProvider = CreateServiceProvider(services); TestServiceScope = RootServiceProvider.CreateScope(); + ServiceProvider = Application.ServiceProvider; application.Initialize(TestServiceScope.ServiceProvider); } diff --git a/framework/test/Volo.Abp.Autofac.Tests/Volo/Abp/Autofac/Interception/Autofac_Interception_Test.cs b/framework/test/Volo.Abp.Autofac.Tests/Volo/Abp/Autofac/Interception/Autofac_Interception_Test.cs index a7a2dfafbc..290abda61b 100644 --- a/framework/test/Volo.Abp.Autofac.Tests/Volo/Abp/Autofac/Interception/Autofac_Interception_Test.cs +++ b/framework/test/Volo.Abp.Autofac.Tests/Volo/Abp/Autofac/Interception/Autofac_Interception_Test.cs @@ -1,11 +1,13 @@ -using Volo.Abp.DynamicProxy; +using System; +using System.Threading.Tasks; +using Volo.Abp.DynamicProxy; namespace Volo.Abp.Autofac.Interception; public class Autofac_Interception_Test : AbpInterceptionTestBase { - protected override void SetAbpApplicationCreationOptions(AbpApplicationCreationOptions options) + protected override Task> SetAbpApplicationCreationOptionsAsync() { - options.UseAutofac(); + return Task.FromResult>(options => options.UseAutofac()); } } diff --git a/framework/test/Volo.Abp.Core.Tests/Volo/Abp/DynamicProxy/AbpInterceptionTestBase.cs b/framework/test/Volo.Abp.Core.Tests/Volo/Abp/DynamicProxy/AbpInterceptionTestBase.cs index befc9af679..f4b584701f 100644 --- a/framework/test/Volo.Abp.Core.Tests/Volo/Abp/DynamicProxy/AbpInterceptionTestBase.cs +++ b/framework/test/Volo.Abp.Core.Tests/Volo/Abp/DynamicProxy/AbpInterceptionTestBase.cs @@ -7,10 +7,10 @@ using Xunit; namespace Volo.Abp.DynamicProxy; -public abstract class AbpInterceptionTestBase : AbpIntegratedTest +public abstract class AbpInterceptionTestBase : AbpAsyncIntegratedTest, IAsyncLifetime where TStartupModule : IAbpModule { - protected override void BeforeAddApplication(IServiceCollection services) + protected override Task BeforeAddApplicationAsync(IServiceCollection services) { services.AddTransient(); services.AddTransient(); @@ -32,6 +32,8 @@ public abstract class AbpInterceptionTestBase : AbpIntegratedTes registration.Interceptors.Add(); } }); + + return Task.CompletedTask; } [Fact]