【问题标题】:How to assert an exception has been thrown如何断言已抛出异常
【发布时间】:2019-09-03 07:53:57
【问题描述】:

我正在使用 MOQ 来设置一种方法来抛出 InvalidOperationException。然后我使用 MSTest Assert.ThrowsException 断言该方法抛出了指定的异常。当我调试测试时,它会抛出异常,而不是断言预期的异常已被抛出。

我已经对此进行了搜索,但没有找到与我的问题相关的示例。我已经为方法[ExpectedException(typeof(InvalidOperationException))] 添加了一个属性,但我得到了相同的结果。我尝试将在 Assert 之外引发异常的代码移动到它自己的代码行中,但我得到了相同的结果。我没有尝试将代码包装到从测试方法调用的自己的方法中,因为我不明白如何将模拟对象作为参数传递给新方法(我会使用什么类型?编译器不例如起订量或起订量)。

[TestClass]
public class UnitTest1
{
    [ExpectedException(typeof(InvalidOperationException))]
    [TestMethod]
    public void TestMethod1()
    {
        var mock = new Mock<IFoo>();

        // throwing when invoked with specific parameters
        mock.Setup(foo => 
             foo.DoSomething("reset")).Throws<InvalidOperationException>();
        //mock.Object.DoSomething("reset");
        Assert.ThrowsException<InvalidOperationException>(() => 
             mock.Object.DoSomething("reset"));
    }
}

【问题讨论】:

  • 你为什么同时使用ExpectedExceptionAssert.ThrowsException?选择一个或另一个。后者在失败时会抛出一个AssertFailedException,无论如何这不会匹配ExpectedException;但是,由于您的 Assert 确实成立(基于您的模拟),那么您的断言不会失败,这意味着它不会抛出 AssertFailedException
  • 还有,真的是扔InvalidOperationException吗?也许这已被处理,但也引发了其他一些异常?
  • 编辑后,您在测试资源管理器中看到了什么?屏幕上的绿色还是红色?无论哪种情况,您都应该看到绿色。

标签: c# unit-testing moq mstest


【解决方案1】:

感谢 Kenneth K 帮助我发现我的错误。根据我所看到的,我相信当您的意图是断言已引发异常时,无法通过单元测试进行调试。但是您可以运行测试并断言已引发异常。要使用 MSTest 正确设置测试以断言异常,请使用 ExpectedExceptions 属性。虽然我认为在这个单元测试的情况下可以以某种方式使用 Assert.ThrowsException,但我无法使这种方法发挥作用。

【讨论】:

  • 可以调试测试。您只需要查看测试资源管理器。寻找异常的测试的全部意义是为了让该异常发生。如果您在调试器中运行,那么在引发异常时您仍将获得正常的调试行为。您关心的是看到最终结果(绿色或红色)。
猜你喜欢
  • 2017-03-09
  • 2011-08-06
  • 1970-01-01
  • 1970-01-01
  • 2013-04-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多