xUnit: Assert deux listes < T > sont égaux?
-
03-07-2019 - |
Question
Je suis nouveau dans TDD et xUnit, je souhaite donc tester ma méthode qui ressemble à quelque chose comme:
List<T> DeleteElements<T>(this List<T> a, List<T> b);
Existe-t-il une méthode Assert que je puisse utiliser? Je pense que quelque chose comme ça serait bien
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);
Y a-t-il quelque chose comme ça?
La solution
xUnit.Net reconnaît les collections, il vous suffit donc de le faire
.Assert.Equal(expected, actual); // Order is important
Vous pouvez voir d'autres assertions de collection disponibles dans CollectionAsserts.cs
Pour les NUnit , les méthodes de comparaison des collections de bibliothèques sont
.CollectionAssert.AreEqual(IEnumerable, IEnumerable) // For sequences, order matters
et
CollectionAssert.AreEquivalent(IEnumerable, IEnumerable) // For sets, order doesn't matter
Plus de détails ici: CollectionAssert
MbUnit contient également des assertions de collection similaires à NUnit: Assert.Collections.cs
Autres conseils
Dans la version actuelle de XUnit (1.5), vous pouvez simplement utiliser
Assert.Equal (prévu, réel);
La méthode ci-dessus effectue une comparaison élément par élément des deux listes. Je ne suis pas sûr que cela fonctionne pour les versions précédentes.
Avec xUnit, si vous souhaitez sélectionner les propriétés de chaque élément à tester, vous pouvez utiliser Assert.Collection.
Assert.Collection(elements,
elem1 => Assert.Equal(expect1, elem1.SomeProperty),
elem2 => {
Assert.Equal(expect2, elem2.SomeProperty);
Assert.True(elem2.TrueProperty);
});
Ceci teste le nombre attendu et garantit que chaque action est vérifiée.
Récemment, j'utilisais les packages xUnit 2.4.0
et Moq 4.10.1
dans mon application asp.net core 2.2.
Dans mon cas, j'ai réussi à le faire fonctionner en deux étapes:
- Définition d'une implémentation de
IEqualityComparer < T >
-
Passez l'instance de comparateur en tant que troisième paramètre dans la méthode
Assert.True
:Assert.True (attendu, actuel, nouveau MyEqualityComparer ());
Mais il existe un autre moyen plus efficace d'obtenir le même résultat en utilisant le package FluentAssertions . Cela vous permet d'effectuer les opérations suivantes:
// Assert
expected.Should().BeEquivalentTo(actual));
Fait intéressant, Assert.Equal ()
échoue toujours même lorsque j'ai commandé les éléments de deux listes pour les obtenir dans le même ordre.