我在我的应用程序中包含一个ADO.NET数据提供程序的数据访问层。 DAL将数据提供者返回的数据转换为.NET对象。我已经看到很多帖子建议对单元测试DAL,但是它让我很担心,那里可能会出现很多错误 - 有很多循环和投射以及空白检查。你如何测试DAL?
我对创建一个类似RhinoMocks的模拟DbProvider有一些想法,但是在每次测试中我不得不模拟的接口数量会非常多,而且我必须设置的期望数量会使测试非常难以阅读。看来,每个测试会比它的测试代码更复杂 - 这将是一场灾难,从单元测试的3个进球的角度来看:
- 可读性
- 可维护性
- 诚信
我有一个想法,实现友好的DbProviderFactory从XML加载示例数据。我可以通过测试中的依赖注入来插入它。它应该使维护测试变得更简单。一个简单的例子可能是:
[TestCase]
public void CanGetCustomer()
{
var expectedCommand = new XmlCommand("sp_get_customer");
expectedCommand.ExpectExecuteDataReader(
resultSet: @"<customer firstName=""Joe"" lastName=""Blogs"" ... />");
var factory = new XmlProviderFactory(expectedCommand);
var dal = new CustomerDal(factory);
Customer customer = dal.GetCustomer();
Assert.IsNotNull(customer, "The customer should never be null");
Assert.AreEqual(
"Joe", customer.FirstName,
"The customer had an unexpected FirstName.");
}
我觉得这个方法 - 使用友好DbProvider - 可能更容易测试DAL代码。它具有以下优点:
- 测试数据将在xml中,并且可以放在源代码控制以及单元测试中。它可能在外部文件中,或在测试中联机。
- 我没有使用真正的数据库,所以这消除了有状态问题。因此,在每次测试之前,我不必将数据库置于已知状态。
- 我不必在每个测试中嘲笑所有的ADO.NET接口。我将编写一套假实现,我可以在整个代码库中重新使用这些实现。
难道人们会对这个想法提出一些批评吗?有没有类似的实现,我可以使用它?
感谢
我同意你所说的一切。但挑战在于测试与ADO.NET IDbProvider实现交互的代码。我想验证代码可以正确处理空值,空结果集或异常情况。我不想再注入更多的抽象层,因为这只是将问题转移到其他地方。嘲笑ADO.NET很复杂,因为使用了很多实体。 – sheikhjabootie 2011-05-22 14:43:44