8

我在使用 Visual Studio 单元测试框架时遇到了一个非常奇怪的情况。装饰为[TestMethod, ExpectedException(typeof(InvalidOperationException))] 失败的测试,带有System.InvalidOperationException.

如果我从测试中删除所有代码(以确保它根本不会抛出任何东西) - 它通过了。就好像ExpectedException根本不存在一样……

如果我用一个虚拟测试开始一个空项目,除了抛出它什么都不做,InvalidOperationException它完全可以按预期工作。

验证了两者都ExpectedExceptionAttribute没有InvalidOperationException被覆盖。不知道还有什么可以在这里尝试...


编辑:通过删除对Microsoft.VisualStudio.QualityTools.UnitTestFrameworkv10.1 的引用并添加 v10.0 来解决问题。不知道为什么这很重要,或者为什么其他属性工作得很好。

4

1 回答 1

4

我个人不使用 ExpectedExeption 属性,因为它不允许您准确指定预期哪个语句会引发异常。例如,您的测试设置代码中可能存在一些问题,该问题引发了一个在您的测试中未执行的 InvalidOperationExeption,突然您的测试通过了。此外,它不允许您检查异常,例如断言它具有正确的消息。

我使用以下方法

[TestMethod]
public void Test()
{
    //Arrange
    var sut = new ClassToTest();
    sut.MethodThatShouldNotThrow();

    //Act
    try
    {
         sut.MethodToTestThatShuldThrow();
    }
    catch(InvalidOperationException ioex)
    {
        //Assert, here you could do additional Asserts on the Exception's properties      
        return;
    }
    Assert.Fail("Expected InvalidOperationException was not thrown");
}
于 2014-06-28T11:43:31.083 回答