Daa*_*aan 4 integration-testing aspnetcore-environment .net-6.0
我一直在使用 WebApplicationFactory 在 .NET 5、.NET Core 3.1 和 .NET Core 2.1 中进行集成测试。这对我来说一切正常。
我只是用以下命令创建我的项目:
dotnet new webapi
Run Code Online (Sandbox Code Playgroud)
然后我看到一个带有 Startup 类的Web api 项目。
然后我创建工厂类的一个实例:
private readonly WebApplicationFactory<Startup> factory = new WebApplicationFactory<Startup>();
Run Code Online (Sandbox Code Playgroud)
WebApplicationFactory 类是我非常喜欢的。它使编写集成测试变得容易。我很喜欢。Microsoft 文档还针对 .NET 6 引用了它。
但是,在使用 .NET 6 时,如何确保我的代码可以编译?
提到的命令行语句:
dotnet new webapi
Run Code Online (Sandbox Code Playgroud)
结果是一个运行良好的项目,但是(安装了 .NET 6 SDK 时)没有 Startup 类……现在我的测试无法编译,原因只有一个:Startup 类不存在。
如何解决这个问题?我发现很难想象我不能再编写集成测试,因为WebApplicationFactory<Startup>不再编译。但现在,这就是我需要面对的现实。我该如何解决这个问题?我期待能够使用该类WebApplicationFactory并继续编写集成测试。但如何呢?
Pan*_*vos 11
.NET 6 RC1 中添加了对此的支持。这是生产中支持的第一个版本。
您可以通过Program而不是Startup. Startup基本上融入了Program现在。该类Program是根据文件中的顶级语句自动生成的Program.cs。但它不是公共类,因此您需要添加InternalsVisibleTo到应用程序的项目文件中以使其对测试项目可见。
<ItemGroup>
<InternalsVisibleTo Include="MinimalApiPlayground.Tests" />
</ItemGroup>
Run Code Online (Sandbox Code Playgroud)
在此示例中,Damien Edwards 定义了一个WebApplicationFactory<Program>来演示测试 Todo 最小 API。
Startup创建测试应用程序本质上与使用::相同
[Fact]
public async Task GetSwaggerUI_Returns_OK()
{
await using var application = new TodoApplication();
var client = application.CreateClient();
var response = await client.GetAsync("/swagger/index.html");
Assert.Equal(HttpStatusCode.OK, response.StatusCode);
}
class TodoApplication : WebApplicationFactory<Program>
{
protected override IHost CreateHost(IHostBuilder builder)
{
// Add mock/test services to the builder here
builder.ConfigureServices(services =>
{
services.AddScoped(sp =>
{
// Replace SQL Lite with test DB
return new SqliteConnection("Data Source=testtodos.db");
});
});
return base.CreateHost(builder);
}
}
Run Code Online (Sandbox Code Playgroud)
该示例中的Program类定义了很多端点:
using System.ComponentModel.DataAnnotations;
using Microsoft.Data.Sqlite;
using Dapper;
var builder = WebApplication.CreateBuilder(args);
var connectionString = builder.Configuration.GetConnectionString("TodoDb") ?? "Data Source=todos.db";
builder.Services.AddScoped(_ => new SqliteConnection(connectionString));
builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen();
var app = builder.Build();
await EnsureDb(app.Services, app.Logger);
if (!app.Environment.IsDevelopment())
{
app.UseExceptionHandler("/error");
}
app.MapGet("/error", () => Results.Problem("An error occurred.", statusCode: 500))
.ExcludeFromDescription();
app.MapSwagger();
app.UseSwaggerUI();
app.MapGet("/", () => "Hello World!")
.WithName("Hello");
...
app.MapDelete("/todos/delete-all", async (SqliteConnection db) => Results.Ok(await db.ExecuteAsync("DELETE FROM Todos")))
.WithName("DeleteAll")
.Produces<int>(StatusCodes.Status200OK);
app.Run();
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
6985 次 |
| 最近记录: |