如何对此方法进行单元测试
public static ICollection<Person> SelectPersonByCountry(string Country, LinkedList<Person> personList)
{
ICollection<Person> selectedPerson = new List<Person>();
if (Country != String.Empty)
{
foreach (Person item in personList)
{
if (item.Country.ToUpper().Equals(Country.ToUpper()))
{
selectedPerson.Add(item);
}
}
}
else
{
// do something
return null;
}
return selectedPerson;
方法CollectionAssert.AreEqual()需要2个参数ICollection和ICollection,但我有 通用ICollections。我需要做什么?
public void TestMethod1()
{
string country = "Ukraine";
LinkedList<lab1.Person> personList = new LinkedList<lab1.Person>();
personList.AddFirst(new Person("Dasda", "Sasha", "Ukraine", "23131", "Ukrainian"));
personList.AddFirst(new Person("Sasa", "OLeg", "Ukraine", "23131", "Ukrainian"));
personList.AddFirst(new Person("Popa", "Sveta", "Ukraine", "23131", "Ukrainian"));
personList.AddFirst(new Person("Bezik", "Vitya", "Ukraine", "23131", "Ukrainian"));
personList.AddFirst(new Person("Hoi", "Oleg", "Ukraine", "23131", "Ukrainian"));
ICollection<Person> expected = new LinkedList<Person>();
expected.Add(new Person("Dasda", "Sasha", "Ukraine", "23131", "Ukrainian"));
expected.Add(new Person("Sasa", "OLeg", "Ukraine", "23131", "Ukrainian"));
expected.Add(new Person("Popa", "Sveta", "Ukraine", "23131", "Ukrainian"));
expected.Add(new Person("Bezik", "Vitya", "Ukraine", "23131", "Ukrainian"));
expected.Add(new Person("Hoi", "Oleg", "Ukraine", "23131", "Ukrainian"));
ICollection expected1 = (ICollection)expected;
ICollection actual = (ICollection)lab1.Person.SelectPersonByCountry(country, personList);
CollectionAssert.AreEqual(expected1, actual );
}
我的方法必须像“乌克兰”中的所有人一样返回收集,但测试未通过..
答案 0 :(得分:3)
方法CollectionAssert.AreEqual()需要2个参数ICollection和ICollection,但我有通用的ICollections。我需要做什么?
大多数通用集合还实现了非通用ICollection
接口,因此您无论如何都可以传递通用集合。
ICollection actual = (ICollection)SelectPersonByCountry(country, personList);
ICollection expected = new[] { person1, person2 };
CollectionAssert.AreEqual(actual, expected);
答案 1 :(得分:2)
实际上有两个(潜在的)原因:
首先,列表的顺序。要向personList添加元素,请使用addFirst,它将元素添加到列表中。要添加预期的元素,请使用Add,将元素追加到列表中。然而,你以同样的顺序传递人。因此,expected和personList的顺序相反。 CollectionsAssert.AreEquals的Doc说明了
集合必须具有相同的计数,并以相同的顺序包含完全相同的对象。
其次,人可能不会重新定义Equals。如果是这种情况,C#默认引用相等,这意味着什么
new Person("Dasda", "Sasha", "Ukraine", "23131", "Ukrainian")
.Equals(new Person("Dasda", "Sasha", "Ukraine", "23131", "Ukrainian")) == false
有三种方法可以解决此问题:
答案 2 :(得分:1)
是的,虽然我从未使用过CollectionAssert.AreEqual,但我很确定这将与如何执行集合中每个元素的基础对象比较有关。 AreEqual doco州;
如果元素的值相等,则元素相等,而不是它们引用的元素 同一个对象。使用Equals比较元素的值 默认值。
我的猜测是你需要确保你的Person对象实现了Equals方法以允许对象比较。指向上述等于方法的链接;
静态Equals(Object,Object)方法指示是否两个 对象,objA和objB是相等的。它还使您可以测试对象 其值为null,表示相等。它比较了objA和objB 平等如下:
确定两个对象是否代表 相同的对象引用。
如果是,则该方法返回true。这个 test等同于调用ReferenceEquals方法。此外, 如果objA和objB都为null,则该方法返回true。它决定了 objA或objB是否为null。如果是这样,则返回false。如果 两个对象不代表相同的对象引用,也不代表 null,它调用objA.Equals(objB)并返回结果。这意味着 如果objA重写Object.Equals(Object)方法,则覆盖此方法 被称为。
请参阅Equals文档页面上的示例,了解如何实现此目标以确保一个人对象实际上与您期望的相同。
编辑:如果您不想在Person对象中覆盖Equals,那么可以在您定义country变量的位置创建一次,然后将相同的Person记录添加到LinkedList中你的ICollection。这样,参考可能是相同的......我想。
答案 3 :(得分:0)
谢谢。我在Person中覆盖了我的Equals方法,现在可以正常工作了。 我这样覆盖,也许它是坏道但你可以提高
public override bool Equals(object objA)
{
Person person = objA as Person;
if (person == null) return false;
return (person.FirstName == this.FirstName && person.LastName == this.LastName && person.Language == this.Language && person.PersonId == this.PersonId)
}