【发布时间】:2013-08-07 15:30:52
【问题描述】:
我想测试一个方法是否将一个对象添加到基类的列表中。
我的问题是该列表受到保护,因此我无法在我的测试安排中填充它。因此列表为空,我的方法无法在特定索引处添加对象。
如何制作存根列表并使用它而不是真正的基类列表而不将其公开?
我正在使用 NUnit 和 Moq。
这是一些模仿我的问题的代码:
public class Person
{
public string Name { get; set; }
readonly List<PhoneNumber> _numbers = new List<PhoneNumber>();
public void AddNumber(PhoneNumber phoneNumber)
{
_numbers.Add(phoneNumber);
}
}
public class PhoneNumber
{
public int Number { get; set; }
}
public class BaseClass
{
protected List<Person> Persons = new List<Person>();
}
public class DerivedClass : BaseClass
{
public void AddNumberToPersons(int index, PhoneNumber phoneNumber)
{
Persons[index].AddNumber(phoneNumber); // <-- Need to test if
// this gets called without errors
}
}
[Test]
public void AddNumberToPersons_WhenAddingNumberToPersons_NumberGetsAddedToList()
{
// I think I need to use a stub list or else the list is empty
// and index is out of range.
// Assert that number is added to the list.
}
【问题讨论】:
-
电话号码是否添加到人身上真的很重要吗?这将如何影响您班级的行为?人受到保护,所以你真的不在乎它的状态。您应该注意会影响您班级用户的更改
-
嗯,你说得对,加不加电话号码没关系。我需要测试的是当我调用 AddNumberToPersons(int index, PhoneNumber phoneNumber) 时。 Persons[index].AddNumber(phoneNumber);被执行。但是我仍然需要一个存根列表来执行该行而不抛出异常对吗?
-
执行
AddNumber方法会如何影响你的类的行为?将电话号码添加到其中一个人后,它的行为会有所不同吗? -
不,它不需要,所以我不需要对 AddNumberToPersons 进行测试?如果我在 AddNumberToPersons 中重构了一些东西来阻止对 AddNumber 的调用,我不想要一个告诉我我破坏了 AddNumberToPersons 的测试吗?
-
我不确定您是否要模拟或存根您正在测试的类的属性。如果有返回电话号码列表的 getter 或方法,请使用输出构建您的 Assert 并将其与您插入的内容进行比较。通常,您希望对复杂或连接的依赖项使用测试替身,而在单元测试中使用真实的东西会很麻烦。
标签: c# unit-testing nunit moq