【问题标题】:ExpectedException on TestMethod Visual Studio 2010TestMethod Visual Studio 2010 上的 ExpectedException
【发布时间】:2013-03-01 08:21:04
【问题描述】:

今天我将所有底层项目的解决方案从 VS2008 升级到 VS2010。除了我的单元测试,一切都很顺利。

首先,只有 Web 项目使用 .NET 4 作为目标框架。所有其他项目仍然使用 .NET 3.5。我将它们全部更改为 .NET 4。

现在,当我调试我的单元测试时,它会在每次异常时中断。在 2008 年,它只是不会通过并告诉我发生了异常。即使我定义了 ExpectedException 属性,它也会停止对每个异常进行调试。

以及我的一项测试示例:

[TestMethod]
[ExpectedException(typeof(EntityDoesNotExistException))]
public void ConstructorTest()
{
    AddressType type = new AddressType(int.MaxValue);
}

EntityDoesNotExistException 是自定义异常,继承了 Exception。

编辑 我查看了 2008 年和 2010 年的异常设置 (ctrl+alt+e)。在两个版本中,设置都是相同的。但是在 2008 年,当我有 ExpectedException 属性时,调试不会中断。在 2010 年它确实打破了。

【问题讨论】:

  • 测试有不同的结果吗?预期的异常是否仍然有效?只是调试的时候不一样吗?

标签: unit-testing visual-studio-2010 c#-4.0


【解决方案1】:

Gerrie 为我指明了正确的方向:

  • 按 Ctrl-Alt-E
  • 打开公共语言运行时异常节点
  • 点击添加
  • 键入 Microsoft.VisualStudio.TestTools.UnitTesting.AssertFailedException
  • 确保两个复选框都未选中。

这将消除失败断言的中断,但当您设置 ExpectedException 时,测试仍然会中断。

我是为此设置 100 奖金的人,因此我们将不胜感激 ;-)

【讨论】:

  • 我添加了条目,但它对我不起作用(VS2015 r3)。 “两个复选框都未选中”是什么意思。我取消选中我添加的那个(Microsoft.VisualStudio.TestTools.UnitTesting.AssertFailedException)。另一个要取消选中的复选框是什么?
【解决方案2】:

【讨论】:

  • 不明白为什么这在 VS2010 中发生了变化。但是感谢您向我展示 Microsoft 对此有不同的看法。
【解决方案3】:

按 Ctrl+Alt+E 并检查 CLR 异常的异常设置中断。如果将其设置为 true,则会发生您描述的行为。

【讨论】:

  • 也就是说2010年改了?这些设置项目或解决方案是否依赖?
  • 我有两个选择:抛出异常中断和用户未处理的异常中断。只有最后一个选项会检查 CLR 异常。
  • 部分解决方案确实从这里开始。有关详细信息,请参阅我自己的答案。
【解决方案4】:

一位 Microsoft 支持人员告诉我在运行单元测试时使用 Ctrl-F5(无需调试即可启动),这似乎可行。

要尝试的另一件事是转到工具|选项|调试 并取消选中“仅启用我的代码”选项。

【讨论】:

    【解决方案5】:

    确保您对 Microsoft.VisualStudio.QualityTools.UnitTestingFramework 的引用是版本 10.0.0.0。

    如果是版本 9.0.0.0,Visual Studio 2010 会出现此问题。

    希望这会有所帮助。如果人们仍然有这个问题。

    【讨论】:

    • @John:这不是因为 2008 不支持预期的异常。这是因为属性类不一样。如果你引用 2008 的测试框架,编译器会将 2008 的属性放在你的测试类上。测试运行器仅检查 2010 的属性(不同的程序集 => 不同的类),因此它根本无法识别该属性。我们遇到了同样的问题。
    • Stefan 很好地解释了我想说的话。 :)
    【解决方案6】:

    我赞同兰德斯特所说的。清除“仅启用我的代码”调试选项为我解决了这个问题。它修复了对断言的破坏和对预期异常的破坏。 http://social.msdn.microsoft.com/Forums/en/vsdebug/thread/25bdf149-5133-4f47-bbf2-1d4ca638fee9 有更多详细信息。

    【讨论】:

      【解决方案7】:

      我遇到了同样的问题,但最终设法让它工作。不太确定如何,但这里列出了我在它不工作到它再次开始工作之间所做的事情。

      • 将正在测试的项目转换为 .NET 4
      • 关闭 CodeCoverage
      • 再次打开 CodeCoverage
      • 对测试项目进行了 RebuildAll

      不确定是哪个位修复了它。无论如何,希望这会有所帮助!

      【讨论】:

      • 我有 VS2010 Professional。代码覆盖率仅在 Premium 和 Ultimate 中可用。不过谢谢你的建议!
      • 我认为我所做的其他事情是继续测试->编辑测试设置,然后执行另存为,覆盖之前的文件。从理论上讲,这不应该有效果,但我确实读到有人删除了他的测试设置文件并解决了他的问题。 HTH
      • 不幸的是,这也不起作用。真是奇怪的行为。
      【解决方案8】:

      我最终将测试更改为这种形式以避免中断。不理想:

        [TestMethod]
        public void Guid()
        {
           try
           {
              Guid g = new Guid("myguid'123'");
           } 
           catch( FormatException fe)
           {
              return;  // expected exception - pass
           }
      
           Assert.Fail(); // exception not thrown - fail
        }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-05-17
        • 2011-07-21
        • 2018-04-15
        • 2017-05-07
        • 1970-01-01
        • 2020-01-21
        相关资源
        最近更新 更多