这可能是一个非常蹩脚的问题,但我需要问。为什么要模拟一个存储库?
如果您正在创建具有硬编码值的对象,然后使用 Moq 将它们作为值从接口上的方法调用中返回(即没有实现)您到底在测试什么?
就像其他答案所说的那样,您这样做是为了测试客户端,而不是存储库(或数据库,或外部服务或其他),但我们这样做有两个关键原因:
确保可重复性并创建例外情况:您希望能够知道您正在测试的内容不会随着时间的推移而退化。如果您的存储库正在更改,您无法确定现在有效的方法以前是否也有效。此外,您可以识别现在可能不会出现在存储库中的异常情况(可能是没有社会安全号码的用户,或者类似的模糊但可能的东西)并将它们包含在您的测试中,从而确保未来的兼容性。
删除依赖项:您想让测试尽可能简单和快速。测试依赖的每一个外部资源都是常规测试的另一个障碍。如果您模拟您的存储库,那么即使存储库不存在或丢失,也可以针对您的客户端运行测试。
例如,如果一个程序连接到一个“真实”数据库,他们的测试套件可能会使用本地(甚至在内存中)SQLite 数据库来测试他们的 DB 行为,这样运行测试的人就不需要配置或连接到实际数据库,发生的任何更改或错误都不会影响共享数据库资源。
您将测试使用该存储库的客户端。
IE 是使用存储库对已知对象集做正确事情的服务。