如何使用WebApplicationFactory对.NET6Web Api项目进行集成测试? [英] How to do integration testing for .NET 6 Web Api projects using WebApplicationFactory?

查看:31
本文介绍了如何使用WebApplicationFactory对.NET6Web Api项目进行集成测试?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我一直在使用WebApplicationFactory在.NET 5、.NET Core3.1和.NET Core2.1中进行集成测试。对我来说一切都很好。

我刚刚使用:

创建了我的项目
dotnet new webapi

然后我看到一个带有Startup类的Web API项目

然后我创建工厂类的一个实例:

private readonly WebApplicationFactory<Startup> factory = new WebApplicationFactory<Startup>();

如上所述herehere

WebApplicationFactory类是我非常喜欢的类。它使编写集成测试变得容易。我非常喜欢它。Microsoft文档also refer to it for .NET 6

但是,在使用.NET 6时,如何确保代码编译?

提到的命令行语句:

dotnet new webapi
产生了一个工作良好的项目,但是(在安装了.NET6SDK的情况下)没有Startup类.现在我的测试无法编译,原因只有一个:Startup类不存在。

如何修复此问题?我发现很难想象我不能再编写集成测试,因为WebApplicationFactory<Startup>不再编译。但现在,这是我需要面对的现实。我怎么才能解决这个问题呢?我期待着能够使用WebApplicationFactory类并继续编写集成测试。但是如何做到呢?

推荐答案

在.NET6RC1中添加了对此的支持。这是生产中支持的第一个版本。

您可以传递Program而不是StartupStartup现在基本上合并为ProgramProgram类是从Program.cs文件中的顶级语句自动生成的。不过,它不是公共类,因此您需要将InternalsVisibleTo添加到应用程序的项目文件中,以使其对测试项目可见。

  <ItemGroup>
    <InternalsVisibleTo Include="MinimalApiPlayground.Tests" />
  </ItemGroup>

this example中,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);
    }
}
该示例中Program class定义了相当多的端点:

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();

这篇关于如何使用WebApplicationFactory对.NET6Web Api项目进行集成测试?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆