【问题标题】:Arbitrary unit tests fail in VS2012 after switching from Moles to Fakes从 Moles 切换到 Fakes 后,VS2012 中的任意单元测试失败
【发布时间】: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


【解决方案1】:

我不太明白为什么拥有来自 VS2010 的旧 .testsettings 文件会是个问题,但删除它并按照 MSDN 的建议添加一个 .runsettings 文件对我来说确实有效。

所有问题都解决了:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-08-22
    • 2015-01-12
    • 1970-01-01
    • 2012-11-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-26
    相关资源
    最近更新 更多