xUnit: Behaupten zwei List sind gleich?
-
03-07-2019 - |
Frage
Ich bin neu in TDD und xUnit so möchte ich meine Methode testen, dass etwas wie folgt aussieht:
List<T> DeleteElements<T>(this List<T> a, List<T> b);
Gibt es eine Assert Methode, die ich verwenden kann? Ich denke, so etwas wie dieses wäre schön
List<int> values = new List<int>() { 1, 2, 3 };
List<int> expected = new List<int>() { 1 };
List<int> actual = values.DeleteElements(new List<int>() { 2, 3 });
Assert.Exact(expected, actual);
Gibt es so etwas wie das?
Lösung
xUnit.Net erkennt Sammlungen, so dass Sie nur tun müssen,
Assert.Equal(expected, actual); // Order is important
Sie können weitere Sammlung Behauptungen in CollectionAsserts.cs
NUnit Bibliothekssammlung Vergleichsmethoden sind
CollectionAssert.AreEqual(IEnumerable, IEnumerable) // For sequences, order matters
und
CollectionAssert.AreEquivalent(IEnumerable, IEnumerable) // For sets, order doesn't matter
Weitere Informationen finden Sie hier: CollectionAssert
MbUnit auch Sammlung Behauptungen ähnlich wie NUnit hat: Assert.Collections.cs
Andere Tipps
In der aktuellen Version von XUnit (1.5) kann man einfach nutzen
Assert.Equal (erwartet, tatsächlich);
Das obige Verfahren wird durch das Element Vergleich der beiden Listen ein Element tun. Ich bin mir nicht sicher, ob dies für eine vorherige Version funktioniert.
Mit xUnit, sollten Sie Kirsche wollen wählen Eigenschaften jedes Element, das Sie Assert.Collection verwenden, um zu testen.
Assert.Collection(elements,
elem1 => Assert.Equal(expect1, elem1.SomeProperty),
elem2 => {
Assert.Equal(expect2, elem2.SomeProperty);
Assert.True(elem2.TrueProperty);
});
Dies testet die erwartete Anzahl und stellt sicher, dass jede Aktion überprüft wird.
Vor kurzem war ich mit xUnit 2.4.0
und Moq 4.10.1
Paketen in meinen asp.net Kern 2.2 App.
In meinem Fall habe ich es geschafft, es mit zwei Schritten Prozess zu bekommen arbeiten:
- Definieren einer Implementierung von
IEqualityComparer<T>
-
Pass die comparer weise als dritter Parameter in
Assert.True
Methode:Assert.True(expected, actual, new MyEqualityComparer());
Aber es ist ein weiterer schöner Weg, um das gleiche Ergebnis erhalten unter Verwendung von FluentAssertions Paket. Es ermöglicht Ihnen Folgendes zu tun:
// Assert
expected.Should().BeEquivalentTo(actual));
Interessanter immer, dass Assert.Equal()
versagt, auch wenn ich die Elemente von zwei Listen bestellt sie in der gleichen Reihenfolge zu erhalten.