2011-10-17 8 views
8

Mam klasy, która zawiera kilka konstrukcjom:Dlaczego Assert.AreEqual (T obj1, Tobj2) niepowodzeniem z identycznych obiektów

public class NavigationMenu 
{ 
    public struct NavigationMenuItem 
    { 
     public bool Enabled { get; set; } 
     public int NumberOfPendingOperations { get; set; } 
    } 

    public NavigationMenuItem SubmitExpenses { get; set; } 
    public NavigationMenuItem ManageExpenses { get; set; } 
    public NavigationMenuItem SubmitBudgets { get; set; } 
    public NavigationMenuItem ManageBudgets { get; set; } 
    public NavigationMenuItem AuthorizeExpenses { get; set; } 
    public NavigationMenuItem ApproveExpenses { get; set; } 
    public NavigationMenuItem PayExpenses { get; set; } 
    public NavigationMenuItem BillExpenses { get; set; } 
    public NavigationMenuItem ManageReturnedExpenses { get; set; } 
    public NavigationMenuItem ManageIncompleteExpenses { get; set; } 
    public NavigationMenuItem ManageOrders { get; set; } 
    public NavigationMenuItem ApproveBudgets { get; set; } 
    public NavigationMenuItem AdministrateSystem { get; set; } 
} 

W badanej jednostki nawiązywać połączenia funkcji i porównać wyniki:

NavigationMenu expected = new NavigationMenu(); 
     expected.SubmitExpenses = new NavigationMenu.NavigationMenuItem { Enabled = true }; 
     expected.ManageExpenses = new NavigationMenu.NavigationMenuItem { Enabled = true }; 

     NavigationMenu actual = HomeControllerHelper.GetNavigationMenuByUserRole(userRole); 

     Assert.AreEqual(expected, actual); 

Ale Assert.AreEqual zawsze zgłasza wyjątek AssertFailedException. Obiekty są identyczne, zweryfikowałem to za pomocą debuggera. Podziel się pomysłami. Dzięki.

+1

Oznacz to, którego języka używasz. – geoffspear

+1

Które ramy testowania jednostkowego używasz? NUnit? MSTest? MbUnit? Coś innego? (zaktualizuj tagi). – Steven

+2

Porównywasz te same obiekty tutaj, czy na pewno się nie uda? –

Odpowiedz

6

Połączenie Assert.AreEqual (oczekiwane, oczekiwane) nie powinno zawieść. Jeśli popełniłeś błąd w swoim pytaniu i miałeś na myśli Assert.AreEqual (oczekiwany, aktualny) i twój HomeControllerHelper.GetNavigationMenuByUserRole zwraca nową instancję NavigationMenu, wtedy wywołanie Assert.AreEqual zawsze się nie powiedzie, ponieważ twój typ NavigationMenu jest klasy, a zatem typ odniesienia, nawet jeśli właściwości instancji zostały ustawione na te same wartości.

Assert.AreEqual wykonuje sprawdzanie równości, jeśli dwie zmienne wskazują na to samo odniesienie (aka, ReferenceEqual), a nie, jeśli dwa odwołania zawierają te same wartości (właściwości).

Można zastąpić metodę Equals klasy NavigationMenu, aby zapewnić niestandardową implementację, jeśli dwa wystąpienia klasy są równe.

+0

W podanym przykładzie porównuje tę samą zmienną. –

+0

Prawdopodobnie miał na myśli Assert.AreEqual (oczekiwany, aktualny), więc twoja odpowiedź jest poprawna –

+0

Powinien być Assert.AreEqual (oczekiwany, aktualny), przepraszam za zamieszanie, i dziękuję za odpowiedź. – Narek

3

Zakładając, że powinna ona być Assert.AreEqual(expected, actual);, jakby to było staded w komentarzach:

Musisz określić sposób porównać NavigationMenuItem obiektów. Atm tylko jego cheking, jeśli jest to ten sam przypadek i oczywiste, że nie są tak udane, musi zawieść.

3

Ponieważ (prawdopodobnie) porównujesz dwie różne instancje obiektu, ale z tymi samymi parametrami. Aby obiekty były "równe", należy zastąpić metodę Equals na obiekcie i wprowadzić tam porównanie.

+1

... i implementuj również GetHashCode() – sll

Powiązane problemy