如何编写异常处理的自动化测试
本文关键字:自动化测试 异常处理 何编写 | 更新日期: 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。