Mock Repository与Real Repository w / Mocked Data

时间:2010-05-19 14:32:16

标签: unit-testing repository domain-driven-design

我必须做一些根本错误的事情。

我正在实施我的存储库,然后使用模拟数据对其进行测试。一切都很好。

现在我想测试我的域对象,所以我将它们指向模拟存储库。

但是我发现我必须重新实现从'真实'存储库到mocks的逻辑,或者创建封装逻辑并与存储库(真实或模拟)交互的'辅助类',然后我也必须测试那些

所以我错过了什么 - 为什么在我可以使用真实的模拟数据时实现和测试模拟存储库?

编辑:澄清一下,通过'模拟数据',我没有点击实际的数据库。我有一个'数据库模拟层',我可以插入返回已知数据的真实存储库。

3 个答案:

答案 0 :(得分:4)

也许你混合你的抽象。也许你谈论的一些助手和逻辑应该在你的域对象中。您的存储库应该实现CRUD接口。因此,您的域逻辑应该使用存储库中的8个操作。良好的检索和糟糕的检索(异常抛出)只是八个中的两个。一个测试是,如何在域对象中处理Bad检索。其余的测试应该是测试一个好的检索。

答案 1 :(得分:1)

单元测试旨在最小化测试元素 - >测试数据路由,以便减少错误发生时的搜索时间 - 错误是在您测试的例程或测试单元中而不是其他任何东西(好吧,可能是操作系统或编译器......但这些非常罕见)。

现在假设您创建了一个数据库访问器模块。该模块似乎工作正常。然后,您创建一个从数据库中读取的配置读取器。您可以在数据库测试单元中的模拟配置数据之上使用真实数据库模块,而不是模拟数据库访问器模块单元测试。它似乎仍然可以正常工作。现在添加一个GUI层,该层使用配置读取器单元返回的配置对象。您可以使用显然有效的真实模块,而不是模拟“煮沸”的配置数据。 现在,您的GUI停止工作以获得特定值。错误在哪里?在GUI中,在config阅读器中,在数据库访问器中还是在模拟数据库中的值中?

换句话说,您不仅要测试您正在编写的代码,还要测试真实的存储库系统,如果发现错误,您还需要一个额外的分析层。

答案 2 :(得分:0)

  

为什么要实现和测试mock   我可以使用真实的存储库   那些有模拟数据的人?

我想这真的归结为你认为你需要拥有多少代码覆盖率。如果你觉得存储库是健全的,你可以用它进行测试,那就去吧。也许存储库单元测试可以在模拟数据库单元测试之前运行,这样您就可以使用真实的存储库进行测试,并确信测试仍然有效。