集成测试中的自定义WebApplicationFactory未在Startup.cs中注册服务(ASP.NET Core 3.1)

问题描述 投票:0回答:1

我遇到了一个问题,我正在使用自定义WebApplicationFactory,但未在Startup.cs中注册服务。我正在使用Asp.Net core 3.1和Xunit。

我在下面的API(startup.cs)中使用扩展方法进行了注册:

public void ConfigureServices(IServiceCollection services)
        {
            services.AddBaseApiConfiguration(Configuration);

            services.AddRepositoryServices();

            services.AddApiServices();

            services.AddMediatrServices();
        }

每个MS文档:

SUT的数据库上下文已在其中注册Startup.ConfigureServices方法。测试应用的builder.ConfigureServices回调在应用程序的执行后执行Startup.ConfigureServices代码已执行。

但是上面没有发生。我正在使用的启动服务都没有被注册(即,我从未使用过的4个扩展方法,也从未注册过)。这引起了一些问题:我的数据库上下文在其构造函数中使用IMediatr,以便可以在context.SaveChangesAsync()成功期间发布事件。但是由于我的服务从未注册过,因此无法找到它。如何确保正确进行?

下面是我的自定义工厂:

    protected override void ConfigureWebHost(IWebHostBuilder builder)
    {
        builder
        .UseEnvironment("Development")
        .ConfigureServices(services =>
        {
            // Remove the app's db context registrations
            var descriptor = services.SingleOrDefault(
                d => d.ServiceType ==
                    typeof(DbContextOptions<AppDbContext>));


            if (descriptor != null)
            {
                services.Remove(descriptor );
            }

            services.AddSingleton<IDbConnectionFactoryService, SqliteConnectionFactoryService>();

            // Add a database context using an in-memory 
            // database for testing.
            services.AddDbContext<AppDbContext>(options =>
            {
                options.UseSqlite("Data Source=sqlitedemo.db");
            });

            // Build the service provider.
            var sp = services.BuildServiceProvider();

            // Create a scope to obtain a reference to the database context 
            using (var scope = sp.CreateScope())
            {
                var scopedServices = scope.ServiceProvider;
                var db = scopedServices.GetRequiredService<AppDbContext>();

                // Ensure the database is created.
                db .Database.EnsureDeleted();
                db .Database.EnsureCreated();
            }
        });
    }

编辑:似乎Startup.cs中的服务被称为之后 CustomWebApplication工厂服务。根据.Net core 3.0,这完全是奇怪的,顺序被改为相反。那么为什么这仍然发生?

Edit 2:需要使用ConfigureTestServices而不是ConfigureServices。

c# asp.net-core
1个回答
0
投票

我在文档中没有找到这个,但是调用ConfigureTestServices确保了CustomWebApplicationFactory服务被调用after调用了启动服务。根据文档,这没有正确指出,但至少这可能会帮助遇到相同问题的其他人。

© www.soinside.com 2019 - 2024. All rights reserved.