c#:Mocking和Repository / Service层

时间:2012-12-29 13:20:39

标签: unit-testing nunit moq rhino-mocks

我正在尝试编写一些单元测试来测试我的服务层,我认为这样做很好,服务层作为存储库的依赖,因此我使用RhinoMocks模拟存储库,所以我正在测试服务层“没有“点击数据库很棒。

现在我需要测试我的存储库层,这与数据库有直接连接所以我必须测试它不是吗?我别无选择,只能进行测试吗?

如果我测试另一个没有访问数据库的存储库实现,那么这不是测试我的实现。

我已经设法模拟了所有较低层,所以任何依赖代码的东西都需要一段时间来运行ie。存储库,然后我嘲笑了这个。结果是我对存储库下面的层的所有测试都很快完成,并且没有命中数据库。

问题是我现在对存储库做了什么。我必须测试它,但它依赖于sql数据库。

非常感谢任何帮助或灵感

提前致谢

3 个答案:

答案 0 :(得分:7)

嗯,一般的答案是这样的。我会编写单元测试来验证存储库层的逻辑,并在新类中打破sql依赖关系并在repo的测试中模拟它。如果存储库层只包含一个sql连接而且没有逻辑,那么在我看来没有什么可以进行单元测试。那么你更适合与连接数据库的集成测试。

答案 1 :(得分:1)

因此,您不拥有的模拟代码是bad practice,我认为最好的选择是通过验收/集成测试来测试存储库

答案 2 :(得分:1)

您当然可以在不与数据库通信的情况下测试您的存储库层。大多数ADO.net类都是可模拟的,如果你小心如何创建它们并且你小心地将它们耦合到接口而不是结晶。不幸的是,ADO.net是在嘲笑之前创建的,这是一种非常流行的做法,它仍然有点痛苦。

我心中真正的问题是你是否试图嘲笑它们。模拟的好处有两个:它们运行得更快,并且它们会强制您封装有关数据库的更多详细信息(如果您想要这样做,可以更轻松地切换数据库技术)。功能测试的好处是它们还测试您的数据库层(存储过程等),它们可以说更容易编写,并且它们更容易维护,因为如果进行数据库更改,集成测试会自动通知,而不是你嘲笑那些被嘲笑的考试。

我会说“最好”的方法是用moqs和真实的数据库来测试它们,因为这样可以让你获得两全其美的效果。但是,它当然是相当昂贵的。