ASP.NET Core 6 Web API 的集成测试引发 System.InvalidOperationException

Posted

技术标签:

【中文标题】ASP.NET Core 6 Web API 的集成测试引发 System.InvalidOperationException【英文标题】:Integration test for ASP.NET Core 6 web API throws System.InvalidOperationException 【发布时间】:2021-10-15 14:21:59 【问题描述】:

我正在尝试了解如何在 ASP.NET Core 6 Web API 控制器上进行集成测试。我已尝试关注我能找到的所有 guides、SO 帖子和建议,但由于某种原因,我不断遇到指南中未提及的错误。

EventControllerTests.cs

namespace UnitTests.ProjectToBeTested.Controllers

    public class EventControllerTests
    
        [Fact]
        public async Task EventController_Post_RespondsOkIfRequestContainsCorrectFeilds_SuccessAsync()
        

            // Arrange
            var application = new WebApplicationFactory<Program>();

            var client = application.CreateClient();
            ...

ProjectToBeTested.csproj

...
    <ItemGroup>
        <InternalsVisibleTo Include="IntegrationTests" />
    </ItemGroup>
...

运行测试时会抛出以下内容:

消息:  System.InvalidOperationException:没有方法'public static IHostBuilder CreateHostBuilder(string[] args)' 或 'public static IWebHostBuilder CreateWebHostBuilder(string[] args)' 发现于 '程序'。或者,可以扩展 WebApplicationFactory`1 并 'CreateHostBuilder' 或 'CreateWebHostBuilder' 可以被覆盖为 提供您自己的实例。

堆栈跟踪:  WebApplicationFactory1.CreateWebHostBuilder() WebApplicationFactory1.EnsureServer() WebApplicationFactory1.CreateDefaultClient(DelegatingHandler[] handlers) WebApplicationFactory1.CreateDefaultClient(Uri baseAddress, DelegatingHandler[] 处理程序) WebApplicationFactory1.CreateClient(WebApplicationFactoryClientOptions options) WebApplicationFactory1.CreateClient() EventControllerTests.EventController_Post_RespondsOkIfRequestContainsCorrectFeilds_SuccessAsync() 行 17 --- 上一个位置的堆栈跟踪结束 ---

This SO post 显示为一种可能的解决方案,但使用的是使用 Startup 类的 pre-6。 .NET 6 解决方案是什么?

如果我改为遵循"Basic tests with the default WebApplicationFactory"-guide,我什至无法构建解决方案,因为测试类构造函数抛出

错误 CS0051 可访问性不一致:参数类型 'WebApplicationFactory' 比方法更难访问 'EventControllerTests.EventControllerTests(WebApplicationFactory)' 集成测试 C:\...\EventControllerTests.cs

【问题讨论】:

你可以像这样使用startup.cs ***.com/a/63603562/6527049 @viveknuna 在 ASP.NET 6 Minimal API 中没有 Startup.cs 您使用的是哪个 .NET 6 版本? RC1? RC2?确保升级到最新版本。你的Program.cs 是什么样的? @PanagiotisKanavos AFAIK 它应该在那里,但最小的 API 只是一种做事方式,没有强制执行,对吧?让我看看文档 错了。没有这样的课。该代码现在位于Program.cs 【参考方案1】:

解决方案:

这是由于测试项目的 Microsoft.AspNetCore.Mvc.Testing 包使用了错误的版本(它使用的是版本 5.*)。确保您使用适合 .NET 6 的版本。截至目前,有一个适合我的 6.0.0-rc.2.21480.10 版本。

【讨论】:

就是这样!甚至没有考虑迁移到 dotnet 6.0 后我必须升级的软件包【参考方案2】:

我无法重现此内容。我使用 .NET 6 RC1 的命令行创建了两个新项目

dotnet new webapi -o webapi1
dotnet new xunit -o test1
dotnet new sln

Web API 项目

我对 Web API 项目所做的唯一更改是将其添加到项目文件中:

  <ItemGroup>
    <InternalsVisibleTo Include="test1" />
  </ItemGroup>

Program.cs 保持不变:

using Microsoft.OpenApi.Models;

var builder = WebApplication.CreateBuilder(args);

// Add services to the container.

builder.Services.AddControllers();
builder.Services.AddSwaggerGen(c =>

    c.SwaggerDoc("v1", new()  Title = "webapi2", Version = "v1" );
);

var app = builder.Build();

// Configure the HTTP request pipeline.
if (app.Environment.IsDevelopment())

    app.UseSwagger();
    app.UseSwaggerUI(c => c.SwaggerEndpoint("/swagger/v1/swagger.json", "webapi2 v1"));


app.UseHttpsRedirection();

app.UseAuthorization();

app.MapControllers();

app.Run();

测试项目

在测试项目中,我添加了对webapi1Microsoft.AspNetCore.Mvc.Testing 包的引用。

我把Unit1.cs改成了

using Microsoft.AspNetCore.Mvc.Testing;
using Xunit;
using webapi2;

namespace test1;

public class UnitTest1

    [Fact]
    public void Test1()
    
        using var app = new WebApplicationFactory<Program>();
        using var client=app.CreateClient();
    

项目编译成功,测试运行成功。

【讨论】:

很奇怪。我创建了一个新解决方案并按照您的步骤操作,但我无法运行测试,即使在新解决方案中,仍然会出现“No method 'public static ...”错误。这是 RC2 和 VS 2022 Preview 5.0 的想法。

以上是关于ASP.NET Core 6 Web API 的集成测试引发 System.InvalidOperationException的主要内容,如果未能解决你的问题,请参考以下文章

创建API服务最小只要4行代码!!!尝新体验ASP.NET Core 6预览版本中的最小Web API(minimal APIS)新特性

在从 Angular 6 调用 ASP.NET Core Web API 的服务器异常上获取 CORS 错误 *only*

将文件从 ASP.NET Core Web api 发布到另一个 ASP.NET Core Web api

ASP.NET Core Web Api 自动帮助页面

《ASP.NET Core 6框架揭秘》实例演示[27]:ASP.NET Core 6 Minimal API的模拟实现

ASP.NET Core Web API