单元测试出现意外异常
本文关键字:异常 意外 单元测试 | 更新日期: 2023-09-27 18:12:17
是否可以对意外异常进行模拟或单元测试?代码覆盖率抱怨捕获没有被测试,但是您如何测试它呢?
public List<Blog> SelectActiveBlogs()
{
List<Blog> returnCode = null;
try
{
returnCode = GetQueryable<Blog>().Where(b => b.IsActive).ToList();
}
catch (Exception ex)
{
ExceptionHandler.HandleException(ex);
}
return returnCode;
}
EDIT: GetQueryable是一种使用存储库工厂来获得db结果的方法,因此在生产中可能会出现从db交互中冒出的异常,所以我想确保我们捕获它们,如果出现问题,因此捕获块存在。
EDIT2:该异常实际上由自定义类处理以保留堆栈跟踪,一旦记录它就不会被重新抛出。问题仍然是,在这种情况下,我是否可以模拟并抛出异常。
不要模仿GetQueryable()方法,而是模仿负责获取queryable类。
GetQueryable()
中应该有这样的代码private IQueryable<T> GetQueryable<T>()
{
return repository.query...
}
因此,不要尝试模拟方法,而是模拟存储库实例,并在调用query时在模拟中抛出异常。
暗示使用最小起订量不应该太复杂——比如
var mock = new Moq.Mock<IRepository<Blog>>();
mock.Setup(r => r.Query()).Throws(new Exception("I'm really unexpected"));
我怀疑这个测试是否会导致更高的代码质量或更少的bug。但是上面的方法会让覆盖工具满意;)
我想你没有测试过它。
我留下了许多异常处理程序,用于以前在测试系统中无法到达的情况。
在这种特殊情况下,您应该删除try/catch/throw,因为这些代码无论如何都是无意义的。
您可以使用ExpectedException
属性来处理这个问题,即使它是意外的。它取决于您传递给实参的typeof
参数。
[TestMethod]
[ExpectedException(typeof(Exception),
"A exception has been throws.")]
public List<Blog> SelectActiveBlogs()
{
List<Blog> returnCode = null;
try
{
returnCode = GetQueryable<Blog>().Where(b => b.IsActive).ToList();
}
catch (Exception ex)
{
throw ex;
}
return returnCode;
}
另一件事,如果你这样实现它,你不需要一个try catch块。如果你捕捉到一个异常,只是重新抛出它(没有任何其他异常处理),这是没有意义的。
希望有帮助,如果没有,请留下评论。祝你今天愉快!
如果您想进入exception
,您可以模拟调用GetQueryable<Blog>()
并返回NULL
,这应该使代码抛出exception
。或者您可以在模拟该调用时抛出异常,这取决于您如何实现模拟。顺便说一句,如果执行throw ex
,将失去该代码中的堆栈跟踪。