【问题标题】:How to unit test class properties when the return value is only for the parent当返回值仅适用于父级时如何对类属性进行单元测试
【发布时间】:2017-12-10 04:09:48
【问题描述】:

好的,我想不出如何恰当地表达这个问题,但举个例子就明白了。假设我有这个类:

public class Subject
{
    public int Id { get; set; }
    public string Name { get; set; }
    public ICollection<Subject> Children { get; set; }
}

所以一个主题有一个主题的集合,而这些主题又可以有主题。然后我就有了这个方法。这会保存主题和主题的孩子,如果有的话:

public int CreateSubject(Subject newSubject)
{
    //...
}

创建主题后,会返回新的 ID。所以在我的单元测试中,我可以通过检查返回值不为零来测试我是否创建了一个主题。现在,我有一个名为该资产的测试,用于返回的 Id:

CreateSubject_ValidValues_CreatesSubject

但我意识到即使孩子们没有得救,这也可能成功。我想要类似的东西:

CreateSubject_ValidValuesWithValidChildren_CreatesSubjectAndChildren

但我不确定如何检查孩子是否成功获救。我不确定要断言什么。我该如何测试这样的东西?

【问题讨论】:

  • 你可以断言Children的长度是否为&gt; 0
  • @12seconds:你能详细说明一下吗?我不明白,自从我添加了孩子之后,它开始是> 0,所以即使它> 0,我也不能确定他们是否成功保存。
  • 如果您正在创建Subject 的新对象,Children 的长度预计为0 否?然后你只需检查Children.Count &gt; 0。现在,如果您在谈论它是否正确保存,这是另一回事,现在我们谈论的是集成测试而不是单元测试。
  • 当我创建主题时,Children 将大于零,这就是 CreateSubject 知道它有孩子要保存的方式。如果孩子为零,这意味着没有孩子可以保存。所以假设我想保存一个有 2 个孩子的主题,我将传递一个有 2 个孩子的主题对象,所以它有 2 个孩子开始。
  • 恕我直言,如果您使用接口会容易得多,因此您可以模拟 ISubject 而不是实例化一个。而主体不应该知道如何保存自己。

标签: c# unit-testing


【解决方案1】:

简单:您无法测试CreateSubject( ) 是否正在创建一个有效的主题,除非您有另一个函数然后通过返回的 ID 获取它。在这种情况下,要测试的有用“单元”不是函数CreateSubject,而是负责创建/检索主题对象等的任何单元。

【讨论】:

    猜你喜欢
    • 2013-09-22
    • 2010-12-09
    • 1970-01-01
    • 1970-01-01
    • 2017-09-11
    • 1970-01-01
    • 2013-11-01
    • 2014-10-02
    • 2019-12-05
    相关资源
    最近更新 更多