簡體   English   中英

ASP.NET Core 6 Web API 的集成測試拋出 System.InvalidOperationException

[英]Integration test for ASP.NET Core 6 web API throws System.InvalidOperationException

我試圖了解如何對 ASP.NET Core 6 Web API 控制器進行集成測試。 我已經嘗試按照我能找到的所有指南、SO 帖子和建議進行操作,但由於某種原因,我不斷遇到指南中未提及的錯誤。

事件控制器測試.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:在“Program”上找不到方法“public static IHostBuilder CreateHostBuilder(string[] args)”或“public static IWebHostBuilder CreateWebHostBuilder(string[] args)”。 或者,可以擴展 WebApplicationFactory`1 並覆蓋“CreateHostBuilder”或“CreateWebHostBuilder”以提供您自己的實例。

堆棧跟蹤:WebApplicationFactory 1.CreateWebHostBuilder() WebApplicationFactory 1.EnsureServer() WebApplicationFactory 1.CreateDefaultClient(DelegatingHandler[] handlers) WebApplicationFactory 1.CreateDefaultClient(Uri baseAddress, DelegatingHandler[] handlers) WebApplicationFactory 1.CreateClient(WebApplicationFactoryClientOptions options) WebApplicationFactory 1.CreateClient () EventControllerTests.EventController_Post_RespondsOkIfRequestContainsCorrectFeilds_SuccessAsync() 第 17 行 --- 上一個位置的堆棧跟蹤結束 ---

這個 SO 帖子顯示為一個可能的解決方案,但使用的是使用 Startup 類的 pre-6。 .NET 6 解決方案是什么?

如果我改為遵循“使用默認 WebApplicationFactory 的基本測試”指南,我什至無法構建解決方案,因為測試類構造函數拋出

錯誤 CS0051 不一致的可訪問性:參數類型“WebApplicationFactory”的可訪問性低於方法“EventControllerTests.EventControllerTests(WebApplicationFactory)”IntegrationTests C:\\...\\EventControllerTests.cs

我無法重現這一點。 我從 .NET 6 RC1 上的命令行創建了兩個新項目

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

網絡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();
    }
}

項目編譯成功,測試運行成功。

解決方案:

這是由於測試項目的 Microsoft.AspNetCore.Mvc.Testing 包使用了錯誤的版本(它使用的是版本 5.*)。 確保您使用適合 .NET 6 的版本。截至目前,有一個適用於我的 6.0.0-rc.2.21480.10 版本。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM