- 创建一个ASP.NET Core Web API项目。使用以下代码将WebApplicationFactory注入ServiceCollection:
services.AddControllers();
services.AddDbContext(options =>
options.UseInMemoryDatabase(databaseName: "TestDb"));
services.AddScoped();
services.AddAutoMapper(typeof(MyProfile).Assembly);
services.AddMvc()
.AddApplicationPart(typeof(Startup).Assembly)
.AddControllersAsServices();
services.AddHttpContextAccessor();
services.AddAuthentication("Test")
.AddScheme("Test", options => { });
services.AddAuthorization(options =>
{
options.AddPolicy("Policy",
policy => policy.Requirements.Add(new TestRequirement()));
});
- 创建MockWebApplicationFactory,继承WebApplicationFactory,并重写ConfigureWebHost方法,为测试提供一个数据库:
public class MockWebApplicationFactory : WebApplicationFactory
{
protected override void ConfigureWebHost(IWebHostBuilder builder)
{
builder.ConfigureServices(services =>
{
var descriptor = services.SingleOrDefault(
d => d.ServiceType ==
typeof(DbContextOptions));
if (descriptor != null)
{
services.Remove(descriptor);
}
services.AddDbContext(options =>
{
options.UseInMemoryDatabase("TestDb");
});
services.AddScoped();
});
}
}
- 创建MockMyService,一个伪造的服务类,实现IMyService接口,以便在某些情况下更好地控制端点的行为:
public class MockMyService : IMyService
{
public string GetMyString()
{
return "Mock string";
}
}
- 编写测试用例:
public class MyControllerTests : IClassFixture
{
private readonly MockWebApplicationFactory _factory;
public MyControllerTests(MockWebApplicationFactory factory)
{
_factory = factory;
}
[Fact]
public async Task GetMyString_ReturnsCorrectString()
{
var client = _factory.CreateClient();
var response = await client.GetAsync("/api