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