【发布时间】:2013-06-18 10:42:50
【问题描述】:
我对一个程序集进行了大约 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 次通过(对于上述类)
一位同事在他的系统上的行为相同。错误信息总是TypeLoadExceptions 比如
测试方法...抛出异常:System.TypeLoadException:无法在程序集“System.DirectoryServices.4.0.0.0.Fakes,Version=4.0.0.0”中加载类型“System.DirectoryServices.Fakes.ShimDirectorySearcher” , Culture=neutral, PublicKeyToken=..."
在 VS2012 本身中,源代码编辑器没有显示任何错误,Intellisense 按预期工作,鼠标工具提示在例如ShimDirectorySearcher 显示它的位置等。此外,当我使用 .NET Reflector 打开正在生成的 Fakes 程序集(例如 System.DirectoryServices.4.0.0.0.Fakes.dll)时,错误消息中显示的类型存在。
在我们从 VS2010 切换到 VS2012 之前,所有测试都运行良好(在调试和发布模式下),但现在我们不知道这里出了什么问题。为什么结果会以上述方式发生变化?为什么即使类型确实存在,我们也会得到 TypeLoadExceptions?
不幸的是,几乎没有任何可以从 Micrsoft 或互联网上获得的帮助。
【问题讨论】:
-
您是否完全摆脱了 Moles 组件/人工制品?还要确保清除所有具有现有程序集的目录并以干净状态开始。不过这很有趣。
-
请在此处或connect.microsoft.com/visualstudio发布一个小副本
-
@Raj - 是的,这样做是因为我以前偶尔会遇到 Moles 问题。我想我可能通过删除
.testsettings文件并改用.runsettings文件找到了解决方案。现在不在工作,但我会进一步调查并保持更新。 @Oleg Sych - 当我可以用一个小的新解决方案重现它来演示问题时,我会这样做。 -
我最近经历了相同的更新过程,发现在 .fakes 文件中清除并指定 StubGeneration 和 ShimGeneration 的命名空间、全名和类型名帮助我摆脱了一些无法解释的错误。 msdn.microsoft.com/en-us/library/…
-
@Batman:我也是这样做的,以消除抱怨某些类型无法伪造的警告,所以不幸的是,这对我的情况没有帮助(没有验证我的今天的其他方法,希望是汤姆。)
标签: unit-testing visual-studio-2012 moles microsoft-fakes