单元测试项目无法找到被测试的程序集(或依赖项)

14
当我尝试运行我的单元测试项目时,出现以下错误: 引发此异常的原因是无法加载文件或程序集“ASSEMBLY_NAME,Version=1.0.0.0,Culture=neutral,PublicKeyToken=null”或其某一个依赖项。 系统找不到指定的文件。 被测试的程序集位于同一解决方案中,每个项目都针对.NET 4.0框架。 它之前可以运行,但今天我又遇到了这个错误。 我无法确定问题在哪里,因为错误信息没有告诉我足够的信息。(例如;没说哪个文件找不到..) 我已经尝试添加一个新的测试项目,但是也出现了相同的错误消息。 有人能指导我吗? 编辑:在诊断构建日志中,出现以下错误:
C:\Program Files\MSBuild\Microsoft\VisualStudio\v10.0\TeamTest\
Microsoft.TeamTest.targets(14,5): 
error : Could not load file or assembly 'ASSEMBLY_NAME, Version=1.0.0.0, 
Culture=neutral, PublicKeyToken=null' or one of its dependencies. 
The system cannot find the file specified.

Done executing task "BuildShadowTask" -- FAILED. (TaskId:671)

Done building target "ResolveTestReferences" in 
      project "ASSEMBLY_NAME.Tests.vbproj" -- FAILED.: (TargetId:985)
10个回答

10

请检查 生成 -> 配置管理器... 菜单。所有项目应该具有相同的平台和已选中的 生成 列。

此外,您可以查看构建的输出 (输出 窗口),它通常更清楚地说明哪个文件无法找到。


感谢您的评论。解决方案中的每个项目都设置为debug/anyCpu。乍一看,输出窗口没有提供更多详细信息。我会再次检查它。 - Rhapsody
2
工具 > 选项 > 项目和解决方案 > 构建和运行 中,您可以将 MSBuild 项目构建输出详细程度 设置为 详细诊断,以检查 ResolveAssemblyReferences 目标的输出。 - JoeBilly
不幸的是,诊断日志没有告诉我任何新信息。完全相同的错误消息,没有任何进一步(有用的)细节。 - Rhapsody
1
@Rhapsody,我已经尝试重现这个问题了。如果出现“未找到程序集或依赖项”的情况,输出窗口会显示以下内容:“error CS0006: Metadata file '{FULL_ASSEMBLY_PATH}' could not be found”。请确保选择了“显示生成输出”选项。 - Snowbear
很遗憾,输出日志(选择Build)中未出现关键字“CS0006”,“Metadata”和“Could not be found”。非常感谢您尝试重现此问题! - Rhapsody
十年后,这仍然很有用。 - Sergio Mazzoleni

8
在查看了一些其他搜索结果后,我在SA上找到了这个问题:Private Accessor for method is not found
删除*.accessor文件后,我的测试项目停止抱怨并成功编译。
感谢大家的帮助!

4
我注意到这是一个解决错误的方法。但现在我所依赖的所有测试访问器都无法编译了。 - Joel McBeth

5
我尝试了以上所有方法,但都没有成功。最终,在csproj文件中我修改了

的部分。
<Private>False</Private>

to

<Private>True</Private>

关于参考文献和所有测试都通过的情况。


同样的问题,但为什么? - Jason Schilling
1
找到以下解释:https://dev59.com/bV8d5IYBdhLWcg3w8WJt#29461896 - Jason Schilling

3

关于执行单元测试存在一个常见错误:执行文件夹。

您确定您的单元测试在正确的文件夹中运行吗?而不是著名的obj文件夹吗?

obj文件夹中,只有生成的程序集被复制,而不是依赖项 -即使复制本地设置为true-。 因此,如果您的测试从这个文件夹启动,所有的依赖项都会丢失。


谢谢你的评论,但我确定我在使用调试文件夹。我在编译解决方案时已经遇到了异常。 - Rhapsody
1
这可能是我的问题,但是如何编辑“测试运行/启动文件夹”? - FizxMike
在大多数情况下,测试运行程序(MSTest、NUnit 等)会处理文件夹中的单元测试。请检查日志中的测试运行程序命令行。一个常见的错误是有一个未定义的测试文件夹,这意味着要运行解决方案及其子目录中找到的所有测试。例如,对于 MSTest:https://msdn.microsoft.com/en-us/library/ms182489.aspx。定义测试文件夹是另一个问题,它取决于运行测试的产品和执行上下文。 - JoeBilly

1
请确保依赖项 > 编辑引用 > 项目(您的项目)已被选中,而不是项目的 .net 程序集。

0

我遇到了这个错误,通过更新NuGet包,我解决了它。

这起作用的原因是我的解决方案中的一个项目引用了同一解决方案中非常旧的另一个项目的编译版本。

当我在Visual Studio中使用“运行所有”测试时,我想它会复制项目的“当前”输出,然后再复制nuget包依赖项dll,如果它们具有相同的名称,则覆盖原始文件。(完全是猜测)

当我检查错误消息时,我可以看到我的项目正在引用依赖项的“版本0.0.10”,但我的解决方案包含了该项目直到“版本0.0.30”,所以差异很大。


0

我曾遇到同样的问题,并发现将dll复制到GAC中解决了问题。虽然我仍不明白为什么它不使用所引用的项目程序集。


0
另一个可能的原因是,如果单元测试项目的程序集名称与被测试的程序集使用相同的名称。(即确保您的单元测试程序集名称是唯一的)。

0

“Assembly Binding Logviewer” 显示为空白屏幕,且“查看日志”按钮被禁用。 - Rhapsody
你是否启用了程序集加载日志?默认情况下它是禁用的。 - Vagaus
经过第二次启动(并开启日志记录),我能够看到一些日志记录。我还没有找到任何有用的东西,但我会继续寻找。 - Rhapsody

-1

参考 -> 标记 dlls -> 右键单击 -> 属性 -> 将“复制本地”设置为 true


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