1

我对一个程序集进行了大约 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, 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 或互联网上几乎没有任何帮助。

4

1 回答 1

0

我不太明白为什么.testsettings从 VS2010 获取旧文件是个问题,但是按照MSDN.runsettings的建议删除它并添加一个文件为我完成了这项工作。

所有问题都解决了:

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

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

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

于 2013-06-20T14:12:00.267 回答