4

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

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

4

3 回答 3

3

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

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

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

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

于 2012-07-25T15:41:32.047 回答
1

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

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

于 2012-07-25T14:40:43.550 回答
1

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

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

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

Jeremy Miller 有一些关于这个主题的不错的 博客文章。

于 2012-07-25T14:41:11.180 回答