如何编写异常处理的自动化测试

本文关键字:自动化测试 异常处理 何编写 | 更新日期: 2023-09-27 18:12:21

我有很多以下类型的代码(每个代码从不同的表中获取数据)。

public class TableOneDAO
{
    public TableOneDAO(IDbConnection dbConnection)
    {
        _dbConnection = dbConnection;
        _log = LogFacade.GetLog();
        _tableOneRowMapper = new TableOneRowMapper();
    }
    public IList<TableOneRecord> FindAll()
    {
        try
        {
            using (IDbCommand cmd = _dbConnection.CreateCommand())
            {
                cmd.CommandText = TableOneSql.FindAllSql();
                return _tableOneRowMapper.GetObjectList(cmd.ExecuteReader());
            }
        }
        catch (Exception exception)
        {
            _log.Error(exception.Message, exception);
            throw;
        }
    }
    private readonly IDbConnection _dbConnection;
    private readonly TableOneRowMapper_tableOneRowMapper;
    private readonly ILog _log;
}

_tableOneRowMapper.GetObjectList(cmd.ExecuteReader())从数据库获取数据并将其映射到List。我们过去遇到过导致映射问题的记录问题,现在希望立即记录这些问题,然后将它们传递给调用应用程序。除了异常处理之外,我对所有内容都进行了测试。我必须保留泛型异常处理。

我正在使用或有以下可供使用:

  • 。Net 3.5
  • VS 2008
  • NUnit 2.5.10.11092
  • Rhino mock3.6

我的问题:

  • 如何为。创建自动化测试(单元或集成)异常处理?
  • 我需要注入TableOneRowMapper和模拟它,以便在调用时抛出异常?
  • 还有其他的吗不注射的方法?
  • 我不担心测试异常处理吗?

如何编写异常处理的自动化测试

?如何为异常处理创建自动化测试(单元或集成)?

// ensure that a given code block throws specific exception
Assert.Throws<ExceptionType>(() => { code block to execute });
// ensure that a given code block DOES NOT throw specific exception
Assert.DoesNotThrow(() => { code block to execute });

?我是否需要注入TableOneRowMapper并模拟它,以便在调用时抛出异常?

  • Unti test - yes,因为它是一个依赖,你应该注入它
  • 集成测试-否

?有没有其他不用注射的方法?

不,否则它将是一个集成测试而不是单元测试

?我不担心测试异常处理吗?

? ?

•如何为异常处理创建自动化测试(单元或集成)?

NUnit有一个ExpectedException属性(http://www.nunit.org/index.php?p=exception&r=2.4),用于验证是否抛出了异常。

您还需要验证异常是否已被记录。LogFacade.GetLog()可以返回模拟日志吗?

•有没有其他方法可以做到这一点,而不注入它?

这取决于你对'注入'的定义。

在一般意义上的注入——使用类中没有创建的东西——您确实需要注入映射器,否则,正如@sll所说,它不是单元测试。

如果担心更改TableOneDAO的变量,可以使用工厂来创建映射器,而不是在DAO中创建映射器。在测试中,可以向工厂注册模拟映射器。

其他

如果你要做很多(创建和测试很多表dao),我会创建一个基本的TableDAO类,并从它派生所有其他的。派生类只需要提供映射器和sql字符串。

这样做,异常处理只需要进行一次单元测试;

hth,

Alan。