您如何对DAL进行单元测试?
|
我的应用程序中有一个数据访问层,其中包装了一个ADO.NET数据提供程序。 DAL将数据提供者返回的数据转换为.NET对象。我看到很多建议不要对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接口。我将编写一组伪造的实现,可以在整个代码库中重复使用。
人们可以对此想法提出一些批评吗?我已经可以使用类似的实现了吗?
谢谢
没有找到相关结果
已邀请:
1 个回复
到街客核