NUnit无法加载DLL文件。

23

当我在Visual Studio中尝试运行单元测试时,出现以下错误信息:

NUnit failed to load w:\Repos\trading.tools\Trading.Tools.Test\bin\x64\Debug\Trading.Tools.Test.dll

我正在使用

  • Visual Studio Community 2013
  • NUnit Adapter 3.4.0.0
  • NUnit 3.4.1

奇怪的是,我有另一个设置方式与这个项目相同的项目,它可以正常工作。

我还下载了NUnit 3.4.1并安装了它。当我运行时

nunit3-console.exe Trading.Tools.Test.dll

一切都运行良好。有什么想法吗?

非常感谢 Konstantin

编辑 #1

这是在尝试运行所有测试时从Visual Studio获取的完整控制台输出。

Test run will use DLL(s) built for framework Framework45 and platform X86. Following DLL(s) will not be part of run: 
Trading.Tools.Test.dll, Trading.Tools.dll are built for Framework Framework45 and Platform X64.
 Go to http://go.microsoft.com/fwlink/?LinkID=236877&clcid=0x409 for more details on managing these settings.
NUnit Adapter 3.4.0.0: Test discovery starting
NUnit failed to load w:\Repos\trading.tools\Trading.Tools.Test\bin\x64\Debug\Trading.Tools.Test.dll
Assembly contains no NUnit 3.0 tests: w:\Repos\trading.tools\Trading.Tools\bin\x64\Debug\Trading.Tools.dll
NUnit Adapter 3.4.0.0: Test discovery complete

如您所见,很明显NUnit期望一个x86的构建,但我却为x64平台进行了构建。但是,如果我使用nunit3-console.exe运行我的x64构建,则一切都可以正常工作。

我在csproj文件中看到的是:

<Reference Include="nunit.framework, Version=2.6.4.14350, Culture=neutral, PublicKeyToken=96d09a1eb7f44a77, processorArchitecture=MSIL">
  <SpecificVersion>False</SpecificVersion>
  <HintPath>..\packages\NUnit.3.4.1\lib\net45\nunit.framework.dll</HintPath>
</Reference>

奇怪的是,它指定了使用Version=2.6.4.14350但引用了一个3.4.1 dll。

那么从这一点出发,下一个问题是如何让NUnit执行我的x64构建呢?有什么想法吗?


1
删除您的 bin 和 obj 文件夹,重新构建并尝试运行。我认为它会起作用。 - Shakir Ahamed
@ShakirAhamed,我删除了两个目录。仍然失败... - Konstantin
你的任何测试或被测试的代码是否尝试加载文件或程序集?如果是,它们是否假定当前目录? - Rob Prouse
@Konstantin,你有没有看过这个问题,请参考一下,可能会对你有帮助。 http://stackoverflow.com/questions/33240704/nunit-failed-to-load-in-tfs-build - Shakir Ahamed
我对整个设置进行了一些实验。我发现,如果我构建x86版本,单元测试是可见且可以执行的。但是,如果我构建x64版本,dll文件就无法加载。然而,在我的另一个项目中,我构建了x64版本,它可以正常工作。有什么想法可以让它在x64上工作吗? - Konstantin
显示剩余7条评论
8个回答

63

我也遇到过类似的问题,关键在于Visual Studio中的测试运行程序指出只有x86程序集会被测试。从这里我认为它会强制使用x86 NUnit运行程序。要更改此设置(至少在VS2015和VS2017中),请转到测试 > 测试设置 > 默认处理器架构 > X64


1
非常感谢,这个方法很有效!你知道这个设置保存在哪个文件中吗? - Konstantin
不幸的是,目前还不确定,但从解决方案到解决方案似乎会有所变化,在切换配置时也不会发生变化,我怀疑它将成为suo文件的一部分。 - Fishus
我的项目以“AnyCPU”编译,并使用“Prefer 32-bit”,当我从“Auto”更改为“x86”时,测试按预期运行。 - Frode Evensen

4

我无法执行我的测试,发现这是其中一个问题。原来我的TestFixtureinternal的。将其转换为public即可解决我的问题。


你可以使用 InternalsVisibleToAttribute 来允许你的测试程序集访问内部成员。 - user276648

3
你可以在runsettings文件中设置执行目标。然后你需要选择该文件。这样应该可以使解决方案更加稳定。 只设置此项的runsettings文件可能如下所示:

enter image description here

要启用它,请按下面的图示操作:

enter image description here

当您从测试菜单(1)中选择它时,它将作为所选项添加到菜单中(2),然后重新构建将使测试出现在测试资源管理器中(3)。
使用runsettings文件可以获得额外的奖励,那就是如果您使用TFS Build系统,则可以正常运行。我已经在这个问题上写了一篇博客文章,请参见http://hermit.no/how-to-control-the-selection-of-test-runner-in-tfsvsts-making-it-work-with-x86x64-selected-targets/

2

在尝试了以上所有其他方法都失败之后,下面的方法对我有效:

我的情况是.NET项目和解决方案位于挂载驱动器上(我使用MacBook和Parallels进行.NET开发)。该驱动器还包含NUnit尝试从中读取“test”DLL的/bin/debug和/bin/release位置。

解决方法是将解决方案/项目文件移动到Windows镜像的C:驱动器。测试立即被发现。

显然,共享/挂载位置不喜欢这样做。我不知道为什么,因为该挂载是永久性的,并且对Windows镜像上的所有用户都具有读/写权限。我怀疑是文件权限问题或者可能整个挂载对运行NUnit发现逻辑的用户/进程不可访问。


2

在编写单元测试方法时,我偶然遇到了这个错误,并注意到其中一个依赖的dll缺失无法加载。在修改测试方法代码并尝试运行后,输出(“测试”)窗口显示了此错误(“NUnit无法加载.dll”)。更新了依赖dll的NuGet包后,nunit开始选择测试项目dll并执行测试用例。


这是最常见的情况。但如何找到缺失的dll? - Fantastory

1
今天我也遇到了这个问题(在基于.NET Framework 4.8的NUnit项目中)。对我而言,解决方案是安装Microsoft.NET.Test.Sdk软件包。

0
为了找到根本原因,尝试使用NUnit CLI运行测试可能会有所帮助。
在我的情况下,CLI记录了一个绑定失败,我在Visual Studio中没有看到。在我修复它之后,我的测试通过CLI和VS正确运行了。

0
我在一个 .Net 6.0 Asp.Net 解决方案中遇到了这个错误,下面是我的解决方法。
这个问题只出现在一个测试项目中,其他测试项目在“测试资源管理器”和调试中都正常运行。
未能检测到的测试用例显示为 "未运行的测试"。

enter image description here

输出中出现了错误:

NUnit Adapter 4.3.1.0:测试发现 NUnit 加载失败 [dll 路径]
[dll 路径] 中没有可用的测试

我的做法是将每个类都注释掉,然后逐个恢复,直到测试停止运行。然后在失败的类中,在 [Test] 方法上设置断点。

如果你无法触发断点,那么它就会在这些类的 [SetUp] 中失败。在 [SetUp] 中设置一个断点,并使用 F11 来跳出方法的边缘,即从最后一个右括号处按 F11。

然后你会收到一个提示,告诉你哪个 DLL 无法加载。

在我的情况下,它是“无法加载 DLL Microsoft.AspNetCore.Mvc.Core”

通过包管理器引用 DLL 可以解决问题。

编辑:如果这发生在单元测试中,你可能想引用 Microsoft.AspNetCore.App FrameworkReference 而不是 Microsoft.AspNetCore.Mvc.Core 包引用:

<ItemGroup>
    <FrameworkReference Include="Microsoft.AspNetCore.App" />
</ItemGroup>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接