从Moles切换到Fakes后,VS2012中的任意单元测试失败

时间:2013-06-18 10:42:50

标签: unit-testing visual-studio-2012 moles microsoft-fakes

我对组件进行了大约300次单元测试,这是我最初在VS2010下开始的解决方案的一部分。许多测试使用了Micrsoft提供的Moles框架,但在升级到VS2012(Update 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,例如

测试方法...抛出异常: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或互联网上几乎没有任何帮助。

1 个答案:

答案 0 :(得分:0)

我不太明白为什么让VS2010中的旧.testsettings文件出现问题,但删除它并按照MSDN的建议添加.runsettings文件为我工作。

所有问题都解决了:

  • 所有单元测试(再次)运行没有问题
  • 任意组合的测试(再次)没有问题
  • 我可以使用Fakes调试测试(在我以前用于获取测试工具化错误之前)

希望这可以帮助遇到问题的其他人,但似乎没有太多关于Fakes的信息。

关于Code Coverage的另一件事:这可以通过菜单Test =>工作(无需配置任何测试设置)分析代码覆盖率。对于TFS构建定义,您可以通过选择Process =>来为构建启用代码覆盖。基本=>自动测试=> 1.测试源。现在,单击相应的文本字段,然后单击单击文本字段时显示的({1}}按钮。现在在... ComboBox中选择Visual Studio Test Runner。现在,您也可以从选项中选择Test runner