Mam klasę PagedModel, która implementuje IEnumerable, aby po prostu zwrócić dane modelu, ignorując dane stronicowania. Nadpisałem także wartości równe i kod GetHashCode, aby umożliwić porównywanie dwóch obiektów PagedModel za pomocą ich wartości ModelData, PageNumber i TotalPages oraz PageSize.Assert.AreEqual nie używa moich nadpisań .Equals na implementacji IEnumerable
tutaj jest problem
Dim p1 As New PagedModel() With {
.PageNumber = 1,
.PageSize = 10,
.TotalPages = 10,
.ModelData = GetModelData()
}
Dim p2 As New PagedModel() With {
.PageNumber = 1,
.PageSize = 10,
.TotalPages = 10,
.ModelData = GetModelData()
}
p1.Equals(p2) =====> True
Assert.AreEqual(p1, p2) ======> False!
to wygląda NUnit dzwoni to wewnętrzna metoda EnumerableEqual porównać mój PagedModel, zamiast przy użyciu Równa metod przewidzianych ja! Czy istnieje sposób na zastąpienie tego zachowania lub czy muszę napisać niestandardowe asercje.
Ta odpowiedź brzmi, że zasadniczo w implementacji należy jawnie zaimplementować IEquatable .Equals ... zobacz http://stackoverflow.com/questions/1577149/explicit-interface-implementation-in-vb-net –
Jay
Nie, wdrożenie IEquatable nie wystarczy. Implementacja GetHashCode jest równie ważna. Ważne jest również zrozumienie, że IEnumerable nie jest w stanie używać Equals (obiektu), jeśli nie zaimplementujesz IEquatable (patrz cytat w moim poście), więc nie jest to absolutnie wymagane. –
csauve
Powiedziałem, że implementuję program IEquatable.Equals, który nie powinien zezwalać na domyślny powrót, ponieważ metoda byłaby przesłonięciem, a implementacja jawnie wywoływałaby tę metodę ... – Jay