首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何使用.NET 6 WebApplicationFactory对Web项目进行集成测试?

如何使用.NET 6 WebApplicationFactory对Web项目进行集成测试?
EN

Stack Overflow用户
提问于 2021-08-30 16:01:57
回答 1查看 3.6K关注 0票数 4

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

我创建我的项目时:

代码语言:javascript
运行
复制
dotnet new webapi

然后,我看到一个带有启动类的web项目

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

代码语言:javascript
运行
复制
private readonly WebApplicationFactory<Startup> factory = new WebApplicationFactory<Startup>();

正如这里这里所解释的。

WebApplicationFactory类是我真正喜欢的东西。它使编写集成测试变得很容易。我非常喜欢它。微软文档也可以参考.NET 6

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

上述命令行语句:

代码语言:javascript
运行
复制
dotnet new webapi

结果在一个工作良好的项目中,但是(安装了.NET 6 SDK时)没有启动类.现在我的测试不只是因为一个原因而编译: Startup类不存在。

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-08-30 16:31:11

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

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

代码语言:javascript
运行
复制
  <ItemGroup>
    <InternalsVisibleTo Include="MinimalApiPlayground.Tests" />
  </ItemGroup>

这个例子中,Damien定义了一个WebApplicationFactory<Program>来演示测试Todo最小API。

创建测试应用程序与使用Startup::

代码语言:javascript
运行
复制
[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);
    }
}

该示例中的程序类定义了相当多的端点:

代码语言:javascript
运行
复制
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();
票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68987057

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档