我遇到了一个问题,我正在使用自定义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。
我在文档中没有找到这个,但是调用ConfigureTestServices确保了CustomWebApplicationFactory服务被调用after调用了启动服务。根据文档,这没有正确指出,但至少这可能会帮助遇到相同问题的其他人。