【问题标题】:Unit test passes when running the test from within Visual Studio IDE but fails when using vstest.console.exe and Microsoft Fakes在 Visual Studio IDE 中运行测试时单元测试通过,但在使用 vstest.console.exe 和 Microsoft Fakes 时失败
【发布时间】:2020-04-19 18:49:06
【问题描述】:
我有一个解决方案,其中包含许多项目。这些项目中的每一个都有一个使用 MSTest V2 的关联测试项目。其中一些测试项目利用了 Microsoft Fakes。
当我在 Visual Studio IDE 中运行测试时,一切正常。但是,我的构建管道失败了。我试图模拟我的构建管道正在做什么,但它在我的机器上也失败了。
我得到的错误信息如下:
System.TypeLoadException:无法加载类型
来自程序集“mscorlib.4.0.0.0.Fakes”的“System.Fakes.ShimDateTime”,
版本=4.0.0.0,文化=中性,PublicKeyToken=0ae41878053f6703'。
在玩过 vstest.console.exe 应用程序之后,似乎如果我单独运行每个测试程序集,所有测试都会通过,但如果我尝试传入多个使用 Microsoft Fakes 的程序集,它们就会失败。
-
vstest.console.exe "Path/To/First.dll"通过
-
vstest.console.exe "Path/To/Second.dll"通过
-
vstest.console.exe "Path/To/First.dll" "Path/To/Second.dll" 失败
-
vstest.console.exe "Path/To/First.dll" "Path/To/Second.dll" /InIsolation 失败
我不确定这里发生了什么或如何解决此问题。
【问题讨论】:
-
我检查了 vstest.console.exe cli options 并且没有测试程序集名称的路径。两个测试程序集都使用 MS.Fakes 吗?请尝试将两个测试程序集 first.dll 和 second.dll 复制到同一文件夹并运行 vstest.console.exe first.dll second.dll。我想只有一个程序集使用 MS Fakes 但 vstest.console.exe 在path/to 中找不到 mscorlib.4.0.0.0.Fakes。
-
标签:
c#
unit-testing
microsoft-fakes
vstest
【解决方案1】:
我最终弄清楚了问题所在:
测试项目 A 没有在 Microsoft Fakes 配置文件中定义 System.DateTime,因此生成了一个名为 mscorlib.4.0.0.0.Fakes.dll 的程序集,其中缺少 System.Fakes.ShimDateTime。
测试项目 B 在 Microsoft Fakes 配置文件中定义了 System.DateTime,因此生成了一个名为 mscorlib.4.0.0.0.Fakes.dll 的程序集,其中包含 System.Fakes.ShimDateTime 类型。
这导致以下结构:
- ProjectA.Tests/bin/Debug/
-
ProjectA.Tests.dll -- 包含 Project A 的单元测试
-
mscorlib.4.0.0.0.Fakes.dll -- 不包含System.Fakes.ShimDateTime
- ProjectB.Tests/bin/Debug/
-
ProjectB.Tests.dll -- 包含 Project B 的单元测试
-
mscorlib.4.0.0.0.Fakes.dll -- 包含System.Fakes.ShimDateTime
我不确定 Visual Studio IDE 有什么不同,但 vstest.console.exe 似乎加载了所有程序集,忽略了基于完全限定的名称。也就是说,它会加载以下文件:
- ProjectA.Tests/bin/Debug/ProjectA.Tests.dll
- ProjectA.Tests/bin/Debug/mcsorlib.4.0.0.0.Fakes.dll
- ProjectB.Tests/bin/Debug/ProjectB.Tests.dll
它忽略了文件ProjectB.Tests/bin/Debug/mcsorlib.4.0.0.0.Fakes.dll,其中定义了类型System.Fakes.ShimDateTime。
对此的唯一解决方案是为每个测试项目运行一个单独的vstest.console.exe(而不是一次全部运行),或者确保生成的 Microsoft Fakes 程序集 (*.Fakes.dll) 具有跨测试项目定义的相同类型板,因此加载哪个版本的mscorlib.4.0.0.0.Fakes.dll 并不重要。而且,由于 Azure Pipelines VsTest 任务使用一次 vstest.console.exe 运行,因此了解这一点很重要。