安装
- Windows 10
- Visual Studio Professional 2017 v15.9.9
- ASP.NET Core 2.2
- EF Core 2.2
- Dapper
- xUnit 2.4.1
描述
我正在使用来自Microsoft.AspNetCore.Mvc.Testing
包的WebApplicationFactory
来设置我的集成测试。
我一直在遵循官方文档来自定义Web主机配置。
系统使用Dapper从数据库查询,因此我在这个特定的集成测试中不使用随EF Core一起提供的In-Memory提供程序。
以下是设置WebApplictionFactory
的代码:
public class CustomWebApplicationFactory<TStartup>
: WebApplicationFactory<TStartup> where TStartup : class
{
protected override void ConfigureWebHost(IWebHostBuilder builder)
{
builder
.UseStartup<TStartup>()
.ConfigureServices(services =>
{
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 dbContext = scopedServices.GetRequiredService<MyDbContext>(); // <-- service not found
dbContext.Database.EnsureCreated();
new MyDbContextSeed()
.SeedAsync(dbContext)
.Wait();
}
});
}
}
问题
无法找到MyDbContext
服务,我理解原因(我认为是)- 因为我的Startup.cs
类中的ServiceProvider
尚未构建。
但问题是我如何在此处从我的启动类访问服务?
为了上下文,集成测试看起来像这样:
public class MyAPITests
: IClassFixture<CustomWebApplicationFactory<Startup>>
{
private readonly HttpClient _client;
private readonly CustomWebApplicationFactory<Startup> _factory;
public MyAPITests(CustomWebApplicationFactory<Startup> factory)
{
_factory = factory;
_client = factory.CreateClient();
}
[Fact]
public async Task Get_ItemAsync_WhenIdNotFound_ReturnsNotFoundStatusCode()
{
// Arrange
var request = new HttpRequestMessage(HttpMethod.Get, "api/v1/item/0");
// Act
var response = await _client.SendAsync(request);
// Assert
Assert.Equal(HttpStatusCode.NotFound, response.StatusCode);
}
}