2013-04-11 188 views
7

我使用Visual Studio单元测试框架的情况非常奇怪。装饰为[TestMethod, ExpectedException(typeof(InvalidOperationException))]的测试失败System.InvalidOperationExceptionExpectedException属性不起作用

如果我从测试中删除所有代码(以确保它不会抛出任何东西) - 它会通过。这就好像ExpectedException甚至没有...

如果我开始一个虚拟测试的空项目,只会抛出InvalidOperationException它完全按预期工作。

已验证,ExpectedExceptionAttributeInvalidOperationException都未被覆盖。不知道还有什么尝试在这里...


编辑:通过去除参考Microsoft.VisualStudio.QualityTools.UnitTestFramework 10.1和10.0版本中加入解决了这一问题。 不知道为什么这个问题或为什么其他属性工作得很好。

+0

如果你的问题的项目,您从测试中删除所有的代码,只需添加一行抛出InvalidOperationException异常,是否按预期方式工作(即通过即使它抛出例外?) – 2013-04-11 21:50:19

+0

@MattSmith不,测试失败。 – 2013-04-11 21:51:20

+0

有趣的问题,很好找。 – Eogcloud 2013-06-25 07:41:51

回答

3

就我个人而言,我不使用ExpectedExeption属性,因为它不允许您准确指定哪个语句将引发异常。例如,在测试设置代码中可能会出现一些问题,这些代码会抛出一个InvalidOperationExeption,这个InvalidOperationExeption在您的测试中未被执行,并且突然通过了您的测试。此外,它不允许你检查Exeception,就像声明它有正确的信息。

我用下面的办法

[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"); 
}