我对一个程序集进行了大约 300 个单元测试,这是我最初在 VS2010 下启动的解决方案的一部分。许多测试使用了 Micrsoft 提供的 Moles 框架,但是在升级到 VS2012(更新 2)后,我想更改测试以使用官方提供的 Fakes 框架。
我相应地更新了相应的测试,这通常只涉及ShimsContext
对代码创建一个和一些小的更改:
前
[TestMethod]
[HostType( "Moles" )]
public void MyUnitTest_CalledWithXyz_ThrowsException()
{
// Arrange
...
MGroupPrincipal.FindByIdentityPrincipalContextIdentityTypeString =
( t1, t2, t3 ) => null;
...
try
{
// Act
...
}
catch( Exception ex )
{
// Assert
...
}
}
后
[TestMethod]
public void MyUnitTest_CalledWithXyz_ThrowsException()
{
using( ShimsContext.Create() )
{
// Arrange
...
ShimGroupPrincipal.FindByIdentityPrincipalContextIdentityTypeString =
( t1, t2, t3 ) => null;
try
{
// Act
...
}
catch( Exception ex )
{
// Assert
...
}
}
}
我的测试项目中有不同的测试类,当我运行测试时,我得到了我无法解释的任意错误,例如:
- 在发布模式下运行一个类的测试 => 21 个测试失败 / 15 个通过
- 在调试模式下对同一类运行测试 => 2 次测试失败 / 34 次通过
- 在发布模式下再次对同一类运行测试 => 2 次测试失败 / 34 次通过
- 运行项目中的所有测试 => 21 次测试失败 / 15 次通过(对于上面提到的类)
同事在他的系统上的行为相同。错误消息总是TypeLoadException
s 例如
测试方法...抛出异常:System.TypeLoadException:无法在程序集“System.DirectoryServices.4.0.0.0.Fakes,Version=4.0.0.0, Culture=neutral, PublicKeyToken”中加载类型“System.DirectoryServices.Fakes.ShimDirectorySearcher” =……”
在 VS2012 本身中,源代码编辑器没有显示任何错误,Intellisense 按预期工作,鼠标工具提示例如 ShimDirectorySearcher 显示它的位置等。此外,当我打开正在生成的 Fakes 程序集时(例如 System.DirectoryServices.4.0. 0.0.Fakes.dll) 与 .NET Reflector,错误消息中显示的类型存在。
在我们从 VS2010 切换到 VS2012 之前,所有测试都运行良好(在调试和发布模式下),但现在我们不知道这里出了什么问题。为什么结果会以上述方式发生变化?为什么即使类型确实存在,我们也会得到 TypeLoadExceptions?
不幸的是,Micrsoft 或互联网上几乎没有任何帮助。