环境
问题
我有 2 个单元测试程序集:
两者都使用 微软假冒框架 (使用 stub 和垫片)。
在本地运行单元测试有效 很好 (在 4 台不同的机器上进行测试,甚至在构建服务器上安装的 Visual Studio 上),但是如果我们使用构建代理进行构建,则某些单元测试会失败并出现异常,例如:
Unable to create instance of class UserTests.ClientUserTest. Error: System.TypeLoadException: Could not load type 'WorldDirect.CCM.Shared.Backend.SmartClassic.Fakes.StubClient' from assembly 'WorldDirect.Smart.Backend.Fakes, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null'.
或相同的垫片:
Test method ExtensionTests.ExtensionTests.UpdateExtensionValidate_NoGrnp_ChecksIpPbxDependencies threw exception: System.TypeLoadExceptio: Could not load type 'WorldDirect.CCM.Shared.Backend.SmartClassic.Fakes.ShimIpPbxRemoteDestination' from assembly 'WorldDirect.Smart.Backend.Fakes, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null'.
有趣的是,他们偶尔会失败,我试图编造一些统计数据:
# | Outcome | Comment
19 | 64/64 passed | only 'UserTests'-UnitTests run, 'ExtensionTests' inactive
20 | 37/64 passed | same source code as #19
21 | 64/64 passed | same source code as #19
22 | 64/66 passed | all 'UserTests' run as well as 2 'ExtensionTests', others still inactive; the 2 ExtensionTests failed with ShimIpPbxRemoteDestination-TypeLoadException
23 | 38/65 passed | same source code as #22, notice NOTHING has changed, however 1 unit test was not even run in 'ExtensionTests'; however the second succeeds; all unit tests in 'UserTests' using MS Fakes fail with a StubClient-TypeLoadException
24 | 38/65 passed | same source code as #22
new day - no more luck :-(
1 | 37/64 passed | uncommented the 2 'ExtensionTests', so same code as #19
2 | 37/64 passed | so same code as #1
3 | 64/64 passed | so same code as #1; suddenly they all work again
请注意,除了提到的更改之外,没有人更改源代码。
所有构建都是使用详细的日志级别进行的;
垫片诊断=“真”;
.fakes-file 中只包含明确需要的垫片/ stub (否则 MSBUILD 使用退出代码 1 失败)。
这一切对我来说似乎很神奇,可能有人已经遇到过同样的问题,或者有人有提示。
提前致谢
最佳答案
我想我知道问题出在哪里了,TypeNotFoundException是正确的,至少没有生成相应的类型(如Reflector所示),这让我思考。更确切地说,每个程序集在 [buildName]\Binaries 下只生成一个生成的假文件-并且因为我的两个程序集伪造了同一个程序集(backend.dll)-这很可能导致竞争条件-一个程序集 build 得晚于另一个生成最终垫片/ stub ;但这并不能说明所有问题。
无论如何,这不会出现在常规 VS 构建中的原因是因为程序集是在它们各自的 [assembly]\FakeAssemblies 目录中生成的,不会影响任何其他单元测试(它应该是这样)。
所以我绕过这个问题的想法是将两个测试组件使用的所有垫片/ stub 放入两个 .fakes-configuration-files;反射器显示这次确实生成了所有需要的垫片/ stub ,但是构建失败了
Exception Message: MSBuild error 1 has ended this build.
任何(详细)日志中都没有更多信息。这个问题是由于没有使用在 .fakes-file 中指定的生成的 shim/stub-object(当然这也是构建服务器刚刚显示的一个问题,否则会太无聊;-))。
所以我想出的最终解决方案是将所有使用垫片/ stub 的代码放入同一个程序集中,其中只有 1 个 .fakes-file 配置了 fake-Assembly。
现在它工作正常:-),但我认为 MS-Dev-Team 在这里还有一些事情要做,不过还没有用 TFS2013 对其进行测试;无论如何都会提交一个错误(因为我已经发现了 2 个)
希望这可以帮助有同样问题的人。
关于visual-studio-2012 - Microsoft Fakes & TFS 2012 Visual Studio Test Runner - 单元测试偶尔失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17717026/