2015-04-20 11 views
6
public void NumericListCanBeSorted() 
{ 
    var sorted = sort.SortNumbers(nums); 
    Assert.AreEqual(sorted, nums); 
} 

public List<int> SortNumbers(List<int> nums) 
    { 
     List<int> sortedList = new List<int>(); 

     for (int i = 0; i < nums.Count(); i++) 
     { 
      for (int j = i + 1; j < nums.Count; j++) 
      { 
       if (nums[i] > nums[j]) 
       { 
        //Swapping values 
        nums[i] = nums[i] + nums[j]; 
        nums[j] = nums[i] - nums[j]; 
        nums[i] = nums[i] - nums[j]; 
       } 
      } 
      sortedList.Add(nums[i]); 
     } 
     return sortedList; 
    } 

Result Message: Assert.AreEqual failed. 
Expected:  <System.Collections.Generic.List`1[System.Int32]>. 
     Actual :<System.Collections.Generic.List`1[System.Int32]>. 

Typy danych oczekiwanych i rzeczywistych są takie same. Wciąż nieudany test. Nie rozumiem, dlaczego? Czy ktoś może mi pomóc mi poznać powód. Co więcej, działa na następującą funkcję.CollectionAssert.AreEquivalent kontra Assert.Equals()

public List<int> SortNumbers(List<int> nums) 
    { 
     List<int> sortedList = new List<int>(); 
     for (int i = 0; i < nums.Count(); i++) 
     { 
      for (int j = i + 1; j < nums.Count; j++) 
      { 
       if (nums[i] > nums[j]) 
       { 
        //Swapping values 
        nums[i] = nums[i] + nums[j]; 
        nums[j] = nums[i] - nums[j]; 
        nums[i] = nums[i] - nums[j]; 
       } 
      } 
     } 
     sortedList = nums; 
     return sortedList; 
    } 

Odpowiedz

17

Porównywanie typów referencyjnych.

Spróbuj użyć CollectionAssert.AreEqual lub CollectionAssert.AreEquivalent.

https://msdn.microsoft.com/en-us/library/microsoft.visualstudio.testtools.unittesting.collectionassert.areequivalent.aspx

Oto co się dzieje:

użyć Assert.AreEqual(List<int>, List<int>), z których, CLR/NET pójść i powiedzieć „to odniesienie do listy 1 tak samo jak liście 2?” Wynik nie jest, dlatego CLR/.NET wysyła fałszywe czytanie.

CollectionAssert wylicza tablice (które są listami wewnętrznymi) i określa, czy mają te same elementy. CollectionAssert.AreEqual sprawdź, czy mają te same przedmioty w tej samej kolejności. CollectionAssert.AreEquivalent sprawdź, czy mają te same przedmioty w dowolnej kolejności.

ANY tablicy/listy/Słownik MUST użycie CollectionAssert do takich porównań.

Na przykład

List<int> l1 = new List<int>(); 
List<int> l2 = l1; 
Assert.AreEqual(l1, l2); 

Spowoduje to prawdą, że ze względu na l2 ustawione w takim samym odniesieniu, jako l1.

Jednak

List<int> l1 = new List<int>(); 
List<int> l2 = new List<int>(); 
Assert.AreEqual(l1, l2); 

Będzie to skutkować fałszywy powodu l2 został popełnił NEW odniesienie do NEW obiektu. Natomiast przy użyciu

CollectionAssert.AreEqual(l1, l2); 

spowoduje prawdziwej w każdej sytuacji powyżej. Dzieje się tak dlatego, że CLR/.NET faktycznie przechodzi przez listę i zasadniczo ją inwentaryzuje.

Kolejna zmiana, ponieważ chciałem wyjaśnić dalej: można również użyć CollectionAssert.AreEquivalent, która nie gwarantuje pozycji w tej samej kolejności, ale po prostu gwarantuje, że tablice/Listy/Słowniki mają te same ilości tych samych przedmiotów . Tj .:

1,2,3,3,2,1 
1,3,2,2,3,1 

To spowoduje prawdziwej z CollectionAssert.AreEquivalent, ale fałszywego z CollectionAssert.AreEqual.

+0

Czy możesz wyjaśnić nieco szczegółowo. Szukam AreEqual. –

+0

@SravanKumar sortedList! = Nums dlatego się nie powiedzie - musisz porównać element po elemencie, a nie dwa obiekty tablicy.Debuguj i spróbuj sprawdzić, czy sortedList == nums w oknie bezpośrednim lub w zegarze. –

+0

Jak działa druga metoda ...? –