为什么要费心嘲笑存储库?

时间:2012-07-25 14:37:52

标签: mocking moq

这可能是一个非常蹩脚的问题,但我需要问一个问题。为什么要去模拟存储库呢?

如果您正在创建具有硬编码值的对象,然后使用Moq将它们作为接口上方法调用的值返回(即没有实现),您究竟测试了什么?

3 个答案:

答案 0 :(得分:3)

就像其他答案所说,你这样做是为了测试客户端,存储库(或数据库,或外部服务,或其他),但有两个关键原因为什么我们这样做:

  1. 确保可重复性并创建特殊情况:您希望能够知道您测试的内容不会随着时间的推移而退化。如果您的存储库正在发生变化,您无法确定现在工作的内容是否也有效。此外,您可以识别当前可能未出现在存储库中的特殊情况(可能是没有社会安全号码的用户,或类似模糊但可能的东西)并将其包含在您的测试中,从而确保将来的兼容性。

    < / LI>
  2. 删除依赖项:您希望尽可能简单快速地进行测试。测试所依赖的每个外部资源都是常规测试的另一个障碍。如果您模拟了您的存储库,那么即使存储库不存在或丢失,也可以针对您的客户端运行测试。

    例如,如果程序挂钩到“真实”数据库,他们的测试套件可能会使用本地(甚至内存)SQLite数据库来测试他们的数据库行为,这样运行测试的人就不需要了配置或连接到实际数据库,发生的任何更改或错误都不会影响共享数据库资源。

答案 1 :(得分:1)

您将测试使用该存储库的客户端。

即。是使用存储库使用已知对象集合做正确事情的服务。

答案 2 :(得分:1)

在这种情况下,或者通常在模拟时,您测试您的存储库,而是测试给定的类,即您的SUT(System Under Test),正确使用存储库,例如通过调用方法(可能是正确的顺序)。

模拟使用行为验证,而不是状态验证。

这意味着您使用模拟来测试您的SUT是否正常运行,而不是在测试用例结束时具有正确的状态。

Jeremy Miller对此主题有一些nice blog posts