it-swarm.com.de

xUnit: Setzen Sie zwei Listen <T> als gleich voraus?

Ich bin neu in TDD und xUnit und möchte meine Methode testen, die ungefähr so ​​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 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?

88
Petar Petrov

xUnit.Net erkennt Sammlungen, so dass Sie nur tun müssen

Assert.Equal(expected, actual); // Order is important

Sie können andere verfügbare Sammlungszusicherungen in CollectionAsserts.cs sehen

Für NUnit Bibliothekssammlungsvergleichsmethoden sind

CollectionAssert.AreEqual(IEnumerable, IEnumerable) // For sequences, order matters

und

CollectionAssert.AreEquivalent(IEnumerable, IEnumerable) // For sets, order doesn't matter

Weitere Details hier: CollectionAssert

MbUnit verfügt auch über Sammlungszusicherungen, die NUnit ähnlich sind: Assert.Collections.cs

105

In der aktuellen Version von XUnit (1.5) können Sie nur verwenden

Assert.Equal (erwartet, tatsächlich);

Die obige Methode führt einen Element-für-Element-Vergleich der beiden Listen durch. Ich bin nicht sicher, ob dies für eine frühere Version funktioniert.

29
hwiechers

Mit xUnit können Sie Assert.Collection verwenden, wenn Sie Eigenschaften für jedes zu testende Element auswählen möchten.

Assert.Collection(elements, 
  elem1 => Assert.Equal(expect1, elem1.SomeProperty),
  elem2 => { 
     Assert.Equal(expect2, elem2.SomeProperty);
     Assert.True(elem2.TrueProperty);
  });

Dadurch wird die erwartete Anzahl getestet und sichergestellt, dass jede Aktion überprüft wird.

11
Drew Williams

Vor kurzem habe ich in meiner asp.net core 2.2-App die Pakete xUnit 2.4.0 Und Moq 4.10.1 Verwendet.

In meinem Fall habe ich es geschafft, es in zwei Schritten zum Laufen zu bringen:

  1. Definieren einer Implementierung von IEqualityComparer<T>
  2. Übergeben Sie die Vergleichsinstanz als dritten Parameter an die Methode Assert.True:

    Assert.True(expected, actual, new MyEqualityComparer());

Es gibt jedoch noch eine andere Möglichkeit, mit dem Paket FluentAssertions dasselbe Ergebnis zu erzielen. Damit können Sie Folgendes tun:

// Assert          
expected.Should().BeEquivalentTo(actual));

Interessanterweise schlägt Assert.Equal() immer fehl, auch wenn ich die Elemente von zwei Listen in der gleichen Reihenfolge angeordnet habe.

1
Dmitry Stepanov