2013-10-10 78 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) 
    } 
相關問題