我有很多以下类型的代码(每个代码都从不同的表中获取数据)。
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。我们已经有过去的问题记录导致映射中的问题,现在想要立即记录它们然后将它们转移到调用应用程序。除了异常处理之外,我还测试了所有内容。我必须保持通用异常处理。
我正在使用或使用以下内容:
我的问题:
答案 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并对其进行模拟,以便在调用时抛出异常?
?有没有其他方法可以做到这一点而不注入它?
不,否则它将是集成测试而非单元测试
?我不担心测试异常处理吗?
???
答案 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,
艾伦。