Czy istnieje łatwy sposób sprawdzenia w teście jednostkowym, że dwie tablice są równe (to znaczy mają taką samą liczbę elementów i każdy element jest taki sam?).
W Javie użyłbym assertArrayEquals (foo, bar);
, ale wydaje się, że nie ma odpowiednika dla C #. Próbowałem Assert.AreEqual(new string[]{"a", "b"}, MyFunc("ab"));
, ale mimo że funkcja zwraca tablicę z „a”, „b”, sprawdzenie nadal kończy się niepowodzeniem
Korzysta z pakietu Visual Studio 2008 Team Suite z wbudowaną strukturą testów jednostkowych.
c#
visual-studio-2008
unit-testing
Anteru
źródło
źródło
object.Equals
iIEqualityComparer<T>
może być konieczne zdefiniowanie ich, aby przekazać błędne potwierdzenie.CollectionAssert.AreEquivalent
(dostępne w Visual Studio 2010) daje więcej informacji. Na przykład, gdy liczba elementów się różni, komunikat określa oczekiwaną i rzeczywistą liczbę elementówClass1.cs:
namespace ClassLibrary1 { public class Class1 { Array arr1 = new[] { 1, 2, 3, 4, 5 }; public Array getArray() { return arr1; } } }
ArrayEqualTest.cs:
[TestMethod()] public void getArrayTest() { Class1 target = new Class1(); Array expected = new []{1,2,3,4,5}; Array actual; actual = target.getArray(); CollectionAssert.AreEqual(expected, actual); //Assert.IsTrue(expected.S actual, "is the test results"); }
Powodzenie testu, znaleziono błąd:
CollectionAssert.AreEqual failed. (Element at index 3 do not match.)
źródło
W .NET 3.5, być może rozważ
Assert.IsTrue(foo.SequenceEqual(bar));
- nie powie ci jednak, w jakim indeksie się różni.źródło
OK, tutaj jest trochę dłuższy sposób na zrobienie tego ...
static void Main(string[] args) { var arr1 = new[] { 1, 2, 3, 4, 5 }; var arr2 = new[] { 1, 2, 4, 4, 5 }; Console.WriteLine("Arrays are equal: {0}", equals(arr1, arr2)); } private static bool equals(IEnumerable arr1, IEnumerable arr2) { var enumerable1 = arr1.OfType<object>(); var enumerable2 = arr2.OfType<object>(); if (enumerable1.Count() != enumerable2.Count()) return false; var iter1 = enumerable1.GetEnumerator(); var iter2 = enumerable2.GetEnumerator(); while (iter1.MoveNext() && iter2.MoveNext()) { if (!iter1.Current.Equals(iter2.Current)) return false; } return true; }
źródło