![](/img/trans.png)
[英]ASP.NET Core API System.InvalidOperationException in localization
[英]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() WebApplicationFactory1.CreateDefaultClient(DelegatingHandler[] handlers) WebApplicationFactory
1.CreateDefaultClient(Uri baseAddress, DelegatingHandler[] handlers) WebApplicationFactory1.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();
測試項目
在測試項目中,我添加了對webapi1
和Microsoft.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.