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

问题描述 投票:0回答:4

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

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

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

c# unit-testing try-catch moq
4个回答
6
投票

检查作为框架一部分的 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,您知道它会失败并抛出异常。 如果您在代码中捕获该异常,那么测试将失败,因为不会抛出任何异常。


3
投票

今天的 catch 块只是重新抛出异常。没有真正的业务逻辑,例如更改状态或添加错误代码或任何其他需要测试的内容。我认为仅仅测试平台附带的“try-catch 块”和“抛出”功能就太过分了。


3
投票

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

微软单元测试
预期异常属性类

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

xUnit.net
如何使用 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 还提供了一种非类型化断言方法来测试抛出的异常。


0
投票
try
    {
        ...
    }
catch (Exception ex)
    {
        _logger.Error(ex.Data, nameof(Create), ex.Message);
    }

我为上面的代码创建了这个测试,它有效:

[Fact]
public async Task AccountTables_ThrowsException()
{
    //Arrange
    var logger = new Mock<ILoggerProvider<AccountTables>>();        
    var accountTable = new AccountTables(logger.Object);

    //Act
    await accountTable.Create(It.IsAny<string>(), CancellationToken.None);

    //Assert
    logger.Verify(z => z.Error(new Exception().Data, nameof(AccountTables.Create), It.IsAny<string>()), Times.Once);
}
© www.soinside.com 2019 - 2024. All rights reserved.