.NET6 xUnit单元测试项目报Can't load type Startup错误如何解决?
故障排查与解决办法
报错根本原因:运行单元测试时,系统尝试在Services.Tests项目中查找Startup类但未找到,可按以下步骤排查修复:
- 检查测试项目是否存在错误的启动类配置:若
xunit.runner.json、项目属性中指定了不存在的Startup类作为启动入口,或开启了不必要的应用域隔离配置,都会触发该错误。 - 检查.NET版本适配问题:若项目使用.NET 6及以上版本的极简顶层语句结构,默认生成的
Program类为内部类,测试项目无法访问时会自动降级查找已弃用的Startup类,导致报错。
修复方案
方案1:修改xUnit运行配置(优先尝试)
在测试项目根目录新增xunit.runner.json文件,写入以下配置:
{ "disableAppDomain": true, "shadowCopy": false }
修改完成后右键点击该文件,将「复制到输出目录」属性设置为「如果较新则复制」,重新运行测试即可。
方案2:暴露主项目内部成员(针对.NET 6+项目)
在主项目的Program.cs文件末尾添加以下代码,显式声明Program类为公共分部类:
public partial class Program { }
同时在主项目的.csproj配置文件中添加节点,允许测试项目访问内部成员:
<ItemGroup> <InternalsVisibleTo Include="Services.Tests" /> </ItemGroup>
方案3:调整测试的服务注册逻辑
若不需要依赖主项目的CreateHostBuilder方法,可以直接在测试构造函数中手动注册所需服务,避免主机初始化时自动查找启动类:
public SendGridEmailSenderTest() { var services = new ServiceCollection(); // 手动注册配置、所需服务 services.Configure<DataAccess.Models.Config.Constants>(opt => { /* 赋值配置 */ }); services.Configure<SendGridEmailSettings>(opt => { /* 赋值配置 */ }); _services = services.BuildServiceProvider(); constants = _services.GetRequiredService<IOptions<DataAccess.Models.Config.Constants>>(); sendGridEmailSettings = _services.GetRequiredService<IOptions<SendGridEmailSettings>>(); }
内容的提问来源于stack exchange,提问作者Ajit Goel
相关产品推荐
相关产品推荐

