Mam dwie identyczne tablice bajtów w następującym segmencie kodu:
/// <summary>
///A test for Bytes
///</summary>
[TestMethod()]
public void BytesTest() {
byte[] bytes = Encoding.UTF8.GetBytes(Properties.Resources.ExpectedPacketData);
TransferEventArgs target = new TransferEventArgs(bytes);
byte[] expected = Encoding.UTF8.GetBytes(Properties.Resources.ExpectedPacketValue);
byte[] actual;
actual = target.Bytes;
Assert.AreEqual(expected, actual);
}
Obie tablice są identyczne co do samego bajtu. W tym scenariuszu, dlaczego Assert.AreEqual zawiedzie?
c#
unit-testing
assert
David Anderson
źródło
źródło
Assert.AreEqual
będzie działać dobrze.Odpowiedzi:
Assert.Equals
testy przy użyciuEquals
metody, która domyślnie używa równości odwołań, a ponieważ są to różne obiekty, nie są równe. Będziesz chciał porównać każdy bajt w tablicy i sprawdzić, czy są równe. Jednym ze sposobów jest przekonwertowanie ich na coś, co implementuje ICollection i zamiast tego użycie CollectionAssert.AreEqual () .źródło
ICollection
Oczywiście tablica już jest . To nawetIList
. Ważne jest, aby Twoja „równość kolekcji” uwzględniała porządkowanie (tj. Zbiory muszą być równe jako sekwencje, a nie tylko jako zbiory matematyczne).Ponieważ tablice nie zastępują
Equals
.Nie powiedziałeś, którego frameworka testowego używasz, ale zasadniczo zależałoby to od tego frameworka do tablic specjalnych. Oczywiście zawsze możesz zaimplementować własną metodę pomocniczą, aby to zrobić. Czasami to robiłem. Jeśli używasz .NET 3.5, możesz skorzystać z
Enumerable.SequenceEqual
metody rozszerzenia:Oczywiście niestandardowa metoda pomocnicza może dostarczyć więcej informacji na temat różnic między nimi. Metody mogą okazać się
MoreLINQ.TestExtensions
pomocne, chociaż są one również dość szorstkie i gotowe.źródło
//Initialize your arrays here byte[] array1 = new byte[0]; byte[] array2 = new byte[0]; Assert.AreEqual(System.Convert.ToBase64String(array1), System.Convert.ToBase64String(array2));
źródło
Metoda Assert.AreEqual pod maską zakończy się jako domyślna dla Object.Equals () dla wartości innych niż null. Domyślną implementacją Object.Equals () jest równość referencyjna. Te 2 tablice mają identyczne wartości, ale pod względem odniesienia do różnic, a zatem nie będą uważane za równe.
źródło
byte[] a = new byte[] {x, y, z...}; byte[] b = new byte[] {x, y, z...}; assertArrayEquals(a , b );
porówna rzeczy ... To działa dla mnie ...
źródło
Utworzono prostą metodę pomocniczą:
private static void CompareArrays<T>(T[] expected, T[] actual) { Assert.AreEqual(expected == null, actual == null, "Expected {0}null value and {1}null found.", expected == null ? "" : "not", actual == null ? "" : "not"); if (expected == null || actual == null) return; Assert.AreEqual(expected.LongLength, actual.LongLength, "Expected Length is {0} actual: {1}", expected.LongLength, actual.LongLength); for (int i = 0; i < expected.Length; i++) { Assert.AreEqual(expected[i], actual[i], "Values on index {0} are not equal. Expected {1} actual: {2}", i, expected[i], actual[i]); } }
źródło