xUnit: assegna due elenchi < T > sono uguali?
-
03-07-2019 - |
Domanda
Sono nuovo di TDD e xUnit, quindi voglio testare il mio metodo che assomiglia a:
List<T> DeleteElements<T>(this List<T> a, List<T> b);
Esiste un metodo Assert che posso usare? Penso che qualcosa del genere sarebbe bello
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);
C'è qualcosa del genere?
Soluzione
xUnit.Net riconosce le raccolte, quindi devi solo farlo
Assert.Equal(expected, actual); // Order is important
Puoi visualizzare altre asserzioni di raccolta disponibili in CollectionAsserts.cs
Per NUnit i metodi di confronto delle raccolte di librerie sono
CollectionAssert.AreEqual(IEnumerable, IEnumerable) // For sequences, order matters
e
CollectionAssert.AreEquivalent(IEnumerable, IEnumerable) // For sets, order doesn't matter
Maggiori dettagli qui: CollectionAssert
MbUnit ha anche asserzioni di raccolta simili a NUnit: Assert.Collections.cs
Altri suggerimenti
Nella versione corrente di XUnit (1.5) puoi semplicemente usare
Assert.Equal (atteso, effettivo);
Il metodo sopra farà un confronto elemento per elemento delle due liste. Non sono sicuro che funzioni per qualsiasi versione precedente.
Con xUnit, se si desidera selezionare le proprietà di ciascun elemento da testare, è possibile utilizzare Assert.Collection.
Assert.Collection(elements,
elem1 => Assert.Equal(expect1, elem1.SomeProperty),
elem2 => {
Assert.Equal(expect2, elem2.SomeProperty);
Assert.True(elem2.TrueProperty);
});
Questa verifica il conteggio previsto e garantisce che ogni azione sia verificata.
Di recente, stavo usando i pacchetti xUnit 2.4.0
e Moq 4.10.1
nella mia app asp.net core 2.2.
Nel mio caso sono riuscito a farlo funzionare con due passaggi:
- Definizione di un'implementazione di
IEqualityComparer<T>
-
Passa l'istanza del comparatore come terzo parametro nel metodo
Assert.True
:Assert.True (previsto, effettivo, nuovo MyEqualityComparer ());
Ma c'è un altro modo migliore per ottenere lo stesso risultato usando il pacchetto FluentAssertions . Ti permette di fare quanto segue:
// Assert
expected.Should().BeEquivalentTo(actual));
È interessante notare che Assert.Equal ()
fallisce sempre anche quando ho ordinato gli elementi di due elenchi per ottenerli nello stesso ordine.