我正在尝试对我的数据访问层进行单元测试,而我正在尝试模拟我的数据连接以对我的DAL进行单元测试,并且我正试图模拟出命令的创建。我想过使用IDbParameters队列来创建参数,但是单元测试需要以正确的顺序配置参数。我正在使用MOQ并且已经浏览了一些文档来指导我完成这个,我发现很多建议不要这样做,而是为连接编写一个包装器,但我的论点是我的DAL应该是我的数据库的包装器,我觉得我不应该写包装器...如果我这样做,我如何单元测试我的包装器的数据库连接?通过编写另一个包装器?它似乎是乌龟一直在下降。
那么有没有人对这个单元测试/模拟的特定领域有任何建议或教程?
答案 0 :(得分:2)
我在交换内存数据库方面取得了很好的成功。这使您有机会进行设置并轻松将其拆除。您还可以模拟连接调用,以便断言传入的参数,然后返回内存数据库。
答案 1 :(得分:0)
Moq使用继承来创建一个模拟类 - 这种方法的缺点是你试图伪造的类应该作为接口传递,至少不会是一个密封的类。一个解决方案是围绕“un-mockable”类创建一个包装类,然后模拟该类,不幸的是,这个解决方案需要相当多的维护。
如果你愿意支付一个模拟框架来支付模拟密封类,可以考虑购买Typemock Isolator或JustMock - 两者都可以模拟任何.NET类和方法(包括密封)类和静态方法)。
答案 2 :(得分:0)
我建议不要使用模拟进行此类测试。我用Java走了这条路,它总是让我觉得我已经证明了我的一点点,除了我可以写出嘲弄的陈述。我建议使用内存数据库或拥有每个开发人员数据库,并接受一些集成测试。
我很方便地转移到.NET,这里是System.Data
&的包装器。 Oracle.DataAccess
被使用,说实话,我喜欢这种方法。
包装器只是提供了一个IDatabase接口,其中包含一些方法,如DataTable ExecuteFunction(...)
,它们提供了一种简单的方法来调用oracle函数或过程。此API的客户端看到的System.Data中唯一的类是DataTable。包装器处理IDbParameter的所有混乱。包装器只有集成测试。
单元测试实际的DAL非常简单,而且编写DAL可以获得更好的效果。不那么可怕的样板来处理。
争论我的DAL应该是我的数据库的包装器
DAL提供对数据库中保存的业务功能的访问。 DB包装器去掉锅炉板代码(并允许你模拟它)。
如果我这样做,我如何为包装器单元测试数据库的连接?
别。接受一些事情是集成测试。