使用NUnit TestEngine探查程序集时遇加载类型失败问题求助
解决NUnit TestEngine加载.NET6 WebAPI测试程序集的依赖缺失问题
核心原因先搞清楚
Microsoft.AspNetCore.Hosting.Abstractions在.NET6里已经被整合进Microsoft.AspNetCore.App共享框架了,不再是独立的NuGet包——你查到的2.2.0是.NET Core 2.x时代的老版本,和.NET6完全不是一回事。报错里要的6.0.0版本,其实是共享框架自带的组件,根本找不到对应的NuGet包。
直接上解决办法
1. 让工具和测试项目用同版本.NET
如果你的工具是基于.NET Framework或者低版本.NET Core写的,肯定找不到.NET6共享框架里的东西。把工具的目标框架改成.NET6(或更高兼容版本),运行时就能自动从共享框架加载ASP.NET Core相关组件。
2. 给TestPackage加运行时配置
创建TestPackage的时候,显式指定目标运行时,帮NUnit TestEngine找对依赖:
var package = new TestPackage(testAssembly.Location); // 明确指定运行时为net6.0 package.AddSetting("RuntimeFramework", "net6.0");
3. 确保测试项目输出目录的依赖完整
虽然你已经把WorkDirectory设成了bin文件夹,但ASP.NET Core的共享框架依赖默认不会复制到输出目录。可以这么做:
- 打开测试项目的.csproj,加上这个设置:
<PropertyGroup> <CopyLocalLockFileAssemblies>true</CopyLocalLockFileAssemblies> </PropertyGroup> - 清理测试项目,重新生成,确保输出目录里所有该有的依赖都在。
4. 手动处理程序集加载
NUnit的LoadTests会加载测试程序集的所有依赖,包括反射引用的类型。可以在工具启动时加个程序集解析钩子:
// 初始化TestEngine之前就加上这个逻辑 AppDomain.CurrentDomain.AssemblyResolve += (sender, args) => { var assemblyName = new AssemblyName(args.Name); if (assemblyName.Name.StartsWith("Microsoft.AspNetCore.")) { // 从.NET6共享框架目录里找 var runtimeDir = RuntimeEnvironment.GetRuntimeDirectory(); var assemblyPath = Path.Combine(runtimeDir, $"{assemblyName.Name}.dll"); if (File.Exists(assemblyPath)) { return Assembly.LoadFrom(assemblyPath); } } return null; };
5. 对比两个相似项目找差异
既然有个项目能正常跑,把它和出问题的项目对比一下:
- 看.csproj里的
TargetFramework、PackageReference、RuntimeIdentifier这些设置有没有不同 - 检查两个项目的bin目录文件列表,看依赖文件有没有差异
- 看看正常的项目里有没有自定义的程序集加载逻辑,或者特殊的类型引用
为啥VS里能正常运行?
VS测试运行器会自动适配目标测试项目的运行环境,包括自动加载共享框架的依赖,而你自己写的工具得手动配置这些环境参数,这就是核心区别。
内容的提问来源于stack exchange,提问作者Julien N
相关产品推荐
相关产品推荐

