我怎么能对这种方法进行单元测试?

时间:2013-10-10 07:35:39

标签: c# .net unit-testing visual-studio-2012

如何对此方法进行单元测试

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



    }

我的方法必须像“乌克兰”中的所有人一样返回收集,但测试未通过..

4 个答案:

答案 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

有三种方法可以解决此问题:

  1. 在Person类中覆盖Equals(和HashCode)
  2. 创建一次Person实例,并在expected列表和personList列表中使用它们。这个解决方案还可以降低拼写错误的风险,顺便说一句。但它会使您的测试依赖于实现,而实现需要返回相同的实例。
  3. 使用CollectionAssert.AreEqual(IEnumerable,IEnumerable,IComparer)来定义Person类之外的相等关系。请记住,您应该为IComparer编写测试!

答案 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)
  }