【问题标题】:Unit Testing - Challenges with Dynamic / Interrelated Repositories单元测试 - 动态/相关存储库的挑战
【发布时间】:2010-10-22 13:36:00
【问题描述】:

我有几个控制器,每个控制器都有一个带有单元测试的测试类。每个单元测试调用一个动作并验证该动作是否处理给定的场景。

测试类有一个设置例程,它实例化了许多假存储库和其他假对象。假存储库具有存储库方法/函数对其进行操作的静态集合。

它运行良好,但我遇到了一些挑战:

  • 当一个假集合中的实体引用另一个假集合中的实体时,存储库的构造函数中的代码会爆炸并变得难以管理

  • 当单元测试调用修改虚假存储库数据的操作时,静态集合会更改状态,从而几乎不可能在其他单元测试中针对相同数据进行操作

所以我有两个问题可能需要您解释一下您的一般方法:

  1. 如何为引用其他假集合/实体的实体设置假集合?

  2. 您的虚假存储库是否支持更新/插入/删除操作?如果是这样,您如何防止一个单元测试的更改影响另一个单元测试?

【问题讨论】:

  • 您能否详细说明您的第一个问题 - 发现很难将其与上下文联系起来。
  • @Ahmad:有关系的实体(即作者有书,书有作者和出版商等)。创建作者列表、书籍列表等非常容易,但建立它们之间的关系(即通过在存储库构造函数中调用实体上的 add 方法)有点麻烦。
  • 有关系的实体很常见,这就是你的领域模型。现在我不想在这里混淆事物,但似乎这里缺少的是对存储库设计的进一步理解。在 DDD(领域驱动设计)中,每个聚合都有一个存储库——这有点关系到实体之间的关系
  • 在一个不相关的说明中,大多数示例应用程序使用服务层、存储库层和一个贫乏的域模型(具有 getter 和 setter 的类)。 IMO 这成为了创建 asp-mvc 应用程序时的心态——我认为这个问题是当你真正尝试建模和设计一些更复杂的东西时,它就会失败

标签: asp.net-mvc unit-testing repository


【解决方案1】:

只要您的存储库是用接口抽象出来的,您就可以使用模拟对象框架来生成一个假存储库并将其注入到正在测试的控制器中。以下是一些受欢迎的选择:

【讨论】:

    【解决方案2】:

    关于第 2 点,为什么不在您的单元测试类的 Setup 函数中设置假存储库(您这样做),并在每次测试后使用 TearDown 重置存储库的状态。

    (这些是 NUnit 特有的属性,所以我无法评论其他框架是否有类似的功能)。

    【讨论】:

    • 谢谢 Ahmad - 我什至不知道 TearDown 属性存在 - 我会检查一下。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-14
    • 2022-06-16
    相关资源
    最近更新 更多