单元测试出现意外异常

本文关键字:异常 意外 单元测试 | 更新日期: 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,将失去该代码中的堆栈跟踪。