代码之家  ›  专栏  ›  技术社区  ›  Nikita Fedyashev

使用存储库模式的模拟测试示例

  •  1
  • Nikita Fedyashev  · 技术社区  · 16 年前

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

    要求:

    1)进口产品采用特殊产品编号标识。

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

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

    目标:

    做一个真正的单元测试(没有数据库交互),验证类别创建/重用是否正常工作。

    如果我错了请纠正我:

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

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

    3)还什么?聚合存储库(聚合根应为产品或产品类别?)

    问题是我们不知道新类别将从数据库中获得什么ID。

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


    我对知识库模式(和持久性无知的领域概念)不熟悉,并且在日常编码中使用模拟测试。

    1 回复  |  直到 16 年前
        1
  •  2
  •   Mark Seemann    16 年前

    据我所知,您需要询问产品和类别之前的存在情况。这暗示了两种不同的存储库:一种是ProductRepository,另一种是CategoryRepository。

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

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

    您可能还想考虑同时进行这两项工作,以接近 Single Responsibility Principle .一个合作者可以是一个服务,它基于解析的数据、现有的类别和产品构造一个新的产品实例。另一个负责检索现有数据。另一个类将实现csv解析器。

    所有类型都将实现接口,这样您就可以有这样的合作者:

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

    然后,您的整个类将采用这三个接口作为依赖项并协调它们的交互。

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

    推荐文章