我想为 try catch 块(C#)编写单元测试。
Public ActionResult Index()
{
try
{
-------------
}
catch(Exception ex)
{
throw;
}
}
正如你所看到的,我在控制器的索引方法中使用了 try-catch 块。在单元测试这个方法时,我也想覆盖 try-catch 块。在 catch 块中我抛出异常。但我不'对此没有任何想法。有人可以建议我处理 try-catch 块的最佳方法吗?仅供参考,我没有在这里指定任何异常类型,它会触发/抛出任何异常。
检查作为框架一部分的 ExpectedExceptionAttribute。
取自链接的示例:
[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,您知道它会失败并抛出异常。 如果您在代码中捕获该异常,那么测试将失败,因为不会抛出任何异常。
今天的 catch 块只是重新抛出异常。没有真正的业务逻辑,例如更改状态或添加错误代码或任何其他需要测试的内容。我认为仅仅测试平台附带的“try-catch 块”和“抛出”功能就太过分了。
这取决于所使用的单元测试框架。我使用的框架提供了一种机制,用于验证被测系统是否已引发异常。下面是一些框架和相关的异常测试功能。
微软单元测试
预期异常属性类
[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 还提供了一种非类型化断言方法来测试抛出的异常。
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);
}