2013-10-10 47 views
3

我怎样才能做到这一点的方法的单元测试我该如何做这个方法的单元测试?

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); 



    } 

我的方法必须返回集合像预期becouse从“乌克兰”我所有的人,但测试没有通过..

+0

就是了预期的收集和实际的。我认为你使用泛型集合并不重要。 –

回答

3

方法CollectionAssert.AreEqual()要2个参数ICollection和ICollection,但我有通用的ICollections。我需要做什么?

大部分泛型集合还实现非泛型接口ICollection,这样你就可以通过反正泛型集合。

ICollection actual = (ICollection)SelectPersonByCountry(country, personList); 
ICollection expected = new[] { person1, person2 }; 

CollectionAssert.AreEqual(actual, expected); 
+0

哦,谢谢你,但我的测试没有通过,但我有相同的集合 – handless

+1

你确定你的集合具有相同的元素顺序? – zabulus

+2

@ user2865903,你是否覆盖Person类中的Equals?如果你没有,Person的两个相同但不同的实例将被认为是不同的。 –

1

是啊,虽然我从来没有用过CollectionAssert.AreEqual,我敢肯定,这将涉及到如何执行的集合中的每个元素的基础对象比较。多克州的AreEqual;

如果元素的值相等,则元素相等,如果它们引用的是同一个对象,则不相等。使用Equals, 默认值来比较元素的值。

我的猜测是你需要确保你的Person对象实现Equals方法来允许对象比较。上面的equals方法的链接状态;

静态Equals(Object,Object)方法指示两个 对象objA和objB是否相等。它还使您能够测试其值为相等的值为空的对象 。它比较objA和objB为 的等式如下:

它确定两个对象是否代表 相同的对象引用。

如果他们这样做,该方法返回true。这个 测试等同于调用ReferenceEquals方法。另外, 如果objA和objB都为空,则该方法返回true。它确定 objA或objB是否为空。如果是这样,它将返回false。如果 两个对象不代表相同的对象引用,也不是 null,则它调用objA.Equals(objB)并返回结果。这意味着 如果objA重写Object.Equals(Object)方法,则会覆盖 。

请参阅Equals文档页面上的示例,了解如何实现这个功能以确保一个人物体与您所期望的完全相同。

编辑:如果你不想重载equals在你的个人目标,那么也许一旦创建它们在其中定义国家变量,然后添加相同的人员记录您的LinkedList和你的ICollection。这样,参考可能是相同的......我想。

2

实际上有两个(潜在)原因:

首先,您的列表的顺序。要向personList添加元素,请使用addFirst,它将元素预先添加到列表中。要将元素添加到预期中,请使用Add将元素附加到列表中。然而,你以相同的顺序通过这些人。因此,预期和personList的顺序相反。收集Doc.AreEquals声明

集合必须具有相同的计数,并且包含相同顺序的完全相同的对象。

二,人可能不重新定义等于。如果是这样的情况下,C#默认为引用相等,什么意味着

new Person("Dasda", "Sasha", "Ukraine", "23131", "Ukrainian") 
    .Equals(new Person("Dasda", "Sasha", "Ukraine", "23131", "Ukrainian")) == false 

有三种方法来解决这个问题:在您的Person类

  1. 覆盖equals(和hashCode)
  2. 创建Person实例一次,并在预期的和personList列表中使用它们。这种解决方案也可以降低错别字的风险,顺便说一句。但它使得你的测试依赖于实现,它需要返回相同的实例。
  3. 使用CollectionAssert.AreEqual(IEnumerable,IEnumerable,IComparer)来定义Person类之外的等式关系。请记住,您应该为IComparer编写测试!
0

谢谢。我在Person中覆盖了我的Equals方法,现在它可以工作。 我重写这样的,也许这是badway但你可以提高

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) 
    } 
相关问题