当 运行 来自 Visual Studio IDE 的测试时单元测试通过,但在使用 vstest.console.exe 和 Microsoft Fakes 时失败
Unit test passes when running the test from within Visual Studio IDE but fails when using vstest.console.exe and Microsoft Fakes
我有一个解决方案,其中包含许多项目。这些项目中的每一个都有一个使用 MSTest V2 的关联测试项目。其中一些测试项目利用了 Microsoft Fakes。
当我 运行 Visual Studio IDE 中的测试时,一切正常。但是,我的构建管道失败了。我试图模拟我的构建管道正在做什么,但它在我的机器上也失败了。
我得到的错误信息如下:
System.TypeLoadException: Could not load type
'System.Fakes.ShimDateTime' from assembly 'mscorlib.4.0.0.0.Fakes,
Version=4.0.0.0, Culture=neutral, 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
失败
我不确定这里发生了什么或如何解决这个问题。
我终于弄明白问题出在哪里了:
测试项目 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
的程序集,其中包含类型 [=12] =].
这导致以下结构:
- 项目A.Tests/bin/Debug/
ProjectA.Tests.dll
-- 包含 项目 A 的单元测试
mscorlib.4.0.0.0.Fakes.dll
-- 不包含System.Fakes.ShimDateTime
- 项目 B.Tests/bin/Debug/
ProjectB.Tests.dll
-- 包含 项目 B 的单元测试
mscorlib.4.0.0.0.Fakes.dll
-- 是否包含 System.Fakes.ShimDateTime
我不确定 Visual Studio IDE 有什么不同,但是 vstest.console.exe 似乎加载了所有程序集,忽略了基于完全限定名称的重复项。也就是说,它加载以下文件:
- 项目 A.Tests/bin/Debug/ProjectA.Tests.dll
- ProjectA.Tests/bin/Debug/mcsorlib.4.0.0.0.Fakes.dll
- 项目 B.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 中的单个 运行,了解这一点很重要。
我有一个解决方案,其中包含许多项目。这些项目中的每一个都有一个使用 MSTest V2 的关联测试项目。其中一些测试项目利用了 Microsoft Fakes。
当我 运行 Visual Studio IDE 中的测试时,一切正常。但是,我的构建管道失败了。我试图模拟我的构建管道正在做什么,但它在我的机器上也失败了。
我得到的错误信息如下:
System.TypeLoadException: Could not load type 'System.Fakes.ShimDateTime' from assembly 'mscorlib.4.0.0.0.Fakes, Version=4.0.0.0, Culture=neutral, 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
失败
我不确定这里发生了什么或如何解决这个问题。
我终于弄明白问题出在哪里了:
测试项目 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
的程序集,其中包含类型 [=12] =].
这导致以下结构:
- 项目A.Tests/bin/Debug/
ProjectA.Tests.dll
-- 包含 项目 A 的单元测试
mscorlib.4.0.0.0.Fakes.dll
-- 不包含System.Fakes.ShimDateTime
- 项目 B.Tests/bin/Debug/
ProjectB.Tests.dll
-- 包含 项目 B 的单元测试
mscorlib.4.0.0.0.Fakes.dll
-- 是否包含System.Fakes.ShimDateTime
我不确定 Visual Studio IDE 有什么不同,但是 vstest.console.exe 似乎加载了所有程序集,忽略了基于完全限定名称的重复项。也就是说,它加载以下文件:
- 项目 A.Tests/bin/Debug/ProjectA.Tests.dll
- ProjectA.Tests/bin/Debug/mcsorlib.4.0.0.0.Fakes.dll
- 项目 B.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 中的单个 运行,了解这一点很重要。