如何处理单元测试中的try-catch块?

时间:2014-04-14 07:01:40

标签: c# unit-testing try-catch moq

我想为try catch block(C#)编写单元测试。

Public ActionResult Index()
 {
     try
     {
         -------------
     }
     catch(Exception ex)
     {
           throw;
     }
}

正如你可以看到我在控制器中使用我的索引方法中的try-catch块。虽然单元测试这个方法我也想覆盖try-catch块。在catch块中我抛出异常。但是我对此没有任何想法。谁能建议我处理try-catch块的最佳方法?仅供参考,我在这里没有指定任何异常类型,它会引发任何异常。

3 个答案:

答案 0 :(得分:5)

检查作为框架一部分的ExpectedExceptionAttribute。

http://msdn.microsoft.com/en-us/library/microsoft.visualstudio.testtools.unittesting.expectedexceptionattribute.aspx

从链接中取得的一个例子:

[TestMethod()]
    [ExpectedException(typeof(System.DivideByZeroException))]
    public void DivideTest()
    {
        DivisionClass target = new DivisionClass();
        int numerator = 4;
        int denominator = 0;
        int actual;
        actual = target.Divide(numerator, denominator);
    }

在这里,你正在进行0除法,你知道它会失败并抛出异常。 如果你在代码上捕获了这个异常,那么测试就会失败,因为没有异常会被抛出。

答案 1 :(得分:3)

今天你的阻止只是重新抛出异常。没有真正的业务逻辑,如更改状态或添加错误代码或任何其他需要测试的内容。我想只是测试" try-catch块"和"扔"平台附带的功能是一种过度的功能。

答案 2 :(得分:3)

这取决于所使用的单元测试框架。我所使用的框架提供了一种机制,用于验证被测系统是否抛出了异常。以下是一些框架和相关的异常测试功能。

Microsoft单元测试
ExpectedExceptionAttributeClass

[TestMethod]
[ExpectedException(typeof(Exception))]
public void Controller_Index_ThrowsException()
{
    var sut = new HomeController();
    sut.Index();
}

xUnit.net
How do I use xUnit.net?
看看如果我预期会出现异常怎么办?部分。

[Fact]
public void Controller_Index_ThrowsException()
{
    var sut = new HomeController();
    Assert.Throws<Exception>(() => sut.Index());
}

[Fact]
public void Controller_Index_DoesNotThrowException()
{
    var sut = new HomeController();
    Assert.DoesNotThrow(() => sut.Index());
}

此外,xUnit.net提供了一种非类型断言方法,用于测试抛出的异常。