您如何对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接口。我将编写一组伪造的实现,可以在整个代码库中重复使用。 人们可以对此想法提出一些批评吗?我已经可以使用类似的实现了吗? 谢谢     
已邀请:
关于数据访问类(DAL,DAC,DAO,存储库等)的适当单元测试(否,不是集成测试),我陷入了很多哲学争论。有人认为这是没有意义的,因为您正在执行集成测试。在单元测试这些经常被忽略的代码单元中,我发现了巨大的价值。首先,为了正确地对数据访问类进行单元测试,必须正确地构造其结构,并且必须在沙漏中划定一条线,让消费者可以与之交互–思考接口。数据访问实现应具有一个定义的接口,该接口将实现仅消费应用程序代码所依赖的接口。您选择的基础结构代码(ADO.NET,NHibernate,NDatabase等)应具有仅数据访问代码所依赖的接口。有了这些基础结构接口(IDBConnection,ISession,IDatabase等)可用并正确利用它们之后,您就可以使用所选的模拟工具在单元测试中模拟这些接口。这为您提供了高质量的数据访问代码,该代码已经过单元测试(模拟基础结构接口),集成测试(针对REAL数据库),并且周围的网络耦合较低。 一个注意事项:我认为,当与数据访问相关的代码经过数据访问(或持久性)层时,应该警惕的不良代码气味。例如,如果您看到连接,命令,会话等使用的数据的级别高于数据访问类的实现,则可能是违反了关注分离的。     

要回复问题请先登录注册