在单元测试中使用try / catch块

时间:2014-03-17 18:58:28

标签: c# .net unit-testing

使用VS的测试框架,我正在编写这样的测试:

[TestMethod]
public void TestSomething() 
{
    try
    {
        var someTestValue = _someTestClass.SomeTestMethod();            

        Assert.IsNotNull(someTestValue);
    }
    catch (Exception e) 
    {
        Assert.Fail(e.Message);
    }
}

我的逻辑是,如果在SomeTestMethod()中抛出异常,我将立即终止通过Assert.Fail(e.Message)显示异常消息的测试。

做事的“正常方式”是:

[TestMethod]
public void TestSomething() 
{
    var someTestValue = _someTestClass.SomeTestMethod();            

    Assert.IsNotNull(someTestValue);
}

我的方法是正确的,还是“正常方式”是正确的?我在写冗余代码吗?

5 个答案:

答案 0 :(得分:5)

我说这是多余的,是的。如果异常是意外结果,则测试失败。测试框架是否以相同的方式处理是否通过抛出异常或失败Assert而失败。基本上,失败的测试是失败的测试。

答案 1 :(得分:2)

如果测试方法抛出异常,测试框架将已经未通过测试。您正在添加额外的工作而没有附加价值。

答案 2 :(得分:2)

您正在编写冗余代码。 Test方法已经捕获异常并且将使测试方法失败。

答案 3 :(得分:1)

如果您预计会遇到异常,请使用以下属性:

[TestMethod]
[ExpectedException(typeof(//Here the exception you expect))]  <------------
public void TestSomething() 
{
//Your test code
}

这意味着如果测试抛出此异常,将通过测试返回。

如果您不去测试异常,那么请避免在测试中使用try / catch块。你会注意到出了问题,因为测试会失败;)

我希望这会有所帮助

答案 4 :(得分:0)

参见本教程;有一个使用[expectedException()]属性的示例单元测试: [ExpectedException单元测试教程] [1]

  [1]: http://msdn.microsoft.com/en-us/library/hh694602%28v=vs.110%29.aspx#BKMK_Writing_your_tests