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

时间:2011-10-26 10:24:24

标签: c# unit-testing nunit automated-tests rhino-mocks

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

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 Mocks 3.6

我的问题:

  • 如何为此创建自动化测试(单元或集成) 异常处理?
  • 我是否需要注入TableOneRowMapper和 嘲笑它,所以它在调用时会引发异常吗?
  • 还有其他吗? 没有注入它的方法吗?
  • 我不担心测试异常处理吗?

2 个答案:

答案 0 :(得分:3)

  

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

// 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 - 是的,因为它是一个依赖你应该注入它
  • 集成测试 - 否
  

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

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

  

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

???

答案 1 :(得分:1)

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

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

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

•如果没有注射它,有没有其他方法可以做到这一点?

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

在注入的一般意义上 - 使用课堂上没有创建的东西 - 你需要注入映射器,否则,正如@sll所说,它不是单元测试。

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

其他

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

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

HTH,

艾伦。