设置
视窗 10
Visual Studio 专业版 2017 v15.9.9
ASP.NET 核心 2.2
英孚核心 2.2
小巧玲珑
xUnit 2.4.1
描述
我正在使用WebApplicationFactory
包中的Microsoft.AspNetCore.Mvc.Testing
来设置我的集成测试。
我一直在关注官方文档来自定义虚拟主机配置。
SUT 使用 Dapper 从数据库中查询,因此我没有使用 EF Core 附带的内存提供程序来进行此特定集成测试。
我设置的代码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找不到该服务,我明白为什么(我认为)- 因为ServiceProvider我的Startup.cs班级尚未构建。
但问题是如何从我的 Startup 类访问服务?
对于上下文,集成测试如下所示:
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);
}
}
慕的地6264312
相关分类