使用Repository模式示例进行模拟测试

时间:2009-12-31 16:13:38

标签: unit-testing mocking repository-pattern aggregate

我正在重构现有的类以支持从CSV文件导入产品。

要求:

1)进口产品在特殊产品编号中标识。

2)产品具有category属性。如果存在这样的类别 - 使用其id,如果不存在 - 首先创建它。

3)如果数据库中已存在具有某些数字的产品 - 在另一种情况下更新其他字段 - 创建新产品。

目标:

进行真正的单元测试(无数据库交互),验证类别创建/重用是否正常。

如果我错了,请纠正我:

1)我需要注入现有产品类别列表。

2)在CSV文件中循环解析产品,看看是否可以在注入的类别列表中找到类别。

3)返回什么?聚合的存储库(聚合根应该是产品还是产品类别?)

问题是我们不知道新类别将从DB获得什么ID。

请告诉我这个问题如何解决的方向?


我是Repository模式(以及持久性无知域概念)的新手,我在日常编码中使用Mock测试。

1 个答案:

答案 0 :(得分:2)

据我所知,您需要询问先前是否存在产品和类别。这暗示了两个不同的存储库:ProductRepository和CategoryRepository。

注入现有类别列表是一种可能的方法,但您还需要注入现有产品列表。

另一种选择是注入两个存储库,只需询问产品或类别是否已存在。如果您需要这些存储库提供的其他功能,这可能是更好的选择,因为您已经拥有所需的依赖项。

您可能还想考虑两者以便更接近Single Responsibility Principle。一个协作者可以是基于解析的数据和现有类别和产品构建新的Product实例的服务。另一个负责检索现有数据。另一个类将实现CSV解析器。

所有类型都会实现接口,因此您可能拥有以下协作者:

public class CsvParser : IParser
public class DataRetriever : IDataRetriever
public class ProductCreator : IProductCreator

您的整体课程将成为将这三个界面作为依赖关系并协调其交互的课程。

这将允许您使用每个依赖项的模拟单独对每个单元进行单元测试。