ASP.NET Core 6 Web API集成测试抛出System.InvalidOperationException如何解决?
问题1:运行测试提示找不到Program类的CreateHostBuilder/CreateWebHostBuilder方法
报错原文
消息: System.InvalidOperationException : No method 'public static IHostBuilder CreateHostBuilder(string[] args)' or 'public static IWebHostBuilder CreateWebHostBuilder(string[] args)' found on 'Program'. Alternatively, WebApplicationFactory`1 can be extended and 'CreateHostBuilder' or 'CreateWebHostBuilder' can be overridden to provide your own instance.
原因
.NET 6 引入了顶级语句语法,默认生成的Program类是隐式的internal类,且没有显式声明CreateHostBuilder方法,旧版WebApplicationFactory的默认逻辑找不到对应的入口。
修复方案
- 打开被测项目的
Program.cs文件,在文件的最后一行添加如下代码,显式声明Program部分类:
public partial class Program { }
- 确认被测项目
csproj中的InternalsVisibleTo配置的程序集名称和你的测试项目的实际程序集名称完全一致:你当前测试代码命名空间前缀为UnitTests,但配置的是IntegrationTests,如果测试项目实际程序集名为UnitTests,要修正配置为:
<ItemGroup> <InternalsVisibleTo Include="UnitTests" /> </ItemGroup>
问题2:参照官方指南写注入代码提示可访问性不一致(错误CS0051)
报错原文
错误 CS0051 可访问性不一致: 参数类型“WebApplicationFactory
”的可访问性低于方法“EventControllerTests.EventControllerTests(WebApplicationFactory )”
原因
两个可能:要么是InternalsVisibleTo配置错误,测试项目无法访问被测项目的internal Program类;要么是测试项目没有安装Microsoft.AspNetCore.Mvc.Testing包,或者包版本和被测项目的.NET 6版本不匹配。
修复方案
- 先完成问题1的两个修复步骤
- 确认测试项目已安装和.NET 6版本匹配的
Microsoft.AspNetCore.Mvc.TestingNuGet包 - 测试类写法参考如下即可正常编译运行:
using Microsoft.AspNetCore.Mvc.Testing; using Xunit; namespace UnitTests.ProjectToBeTested.Controllers { // 继承IClassFixture开启依赖注入 public class EventControllerTests : IClassFixture<WebApplicationFactory<Program>> { private readonly HttpClient _testClient; // 注入WebApplicationFactory实例 public EventControllerTests(WebApplicationFactory<Program> factory) { _testClient = factory.CreateClient(); } [Fact] public async Task EventController_Post_RespondsOkIfRequestContainsCorrectFields_SuccessAsync() { // Arrange // Act // Assert } } }
内容的提问来源于stack exchange,提问作者r .r

