Je suis raisonnablement nouveau pour les tests unitaires et je rencontre un problème. J'ai deux collections (decks) détenant des objets (cartes), avec les cartes étant des objets qui ont une pièce d'identité, une valeur, une conviction, etc. p>
J'écris un test de l'unité pour voir si la méthode de mon shuffle () fonctionne, je tiens donc à tester si un pont non traversé (qui crée 52 cartes avec IDS 0-51) et une terrasse mélangée est dans le même ordre ou ne pas. De toute évidence, les cartes sont des objets uniques, même s'ils tiennent les mêmes valeurs. Donc, par définition, des tests pour voir s'ils ont la même chose aura toujours de faux. Je suis très très nouveau à Nunit (juste l'installé il y a deux jours) et je me débats toujours avec la syntaxe ici et là. P>
Idéalement, je voudrais une affirmation de vérifier si l'ordre des deux collections est identique, avec la commande déterminée par les identifiants des cartes, car, comme des objets, ils sont tous uniques et donc toujours dans un ordre différent. Maintenant, je peux vérifier si le pont mélangé n'est plus commandé par ID, mais ce serait un mauvais test de l'unité car il suppose qu'un pont non affrontement est toujours commandé par ID. Je peux aussi vérifier le pont non-jets, mais il semble plutôt inélégant de la tester de cette façon sans comparer réellement les deux ponts. P>
Je souhaite également que l'affirmation vérifie que mon constructeur de pont ne crée que des identifiants uniques, mais à nouveau, tous les objets de la collection sont toujours uniques mais je ne connais pas la syntaxe (s'il existe) pour vérifier l'unicité d'un caractère spécifique. propriété de toutes les cartes. p>
J'ai googler comme un fou et j'essayais beaucoup de choses de syntaxe différentes de la force brute, mais je suis à perte maintenant. J'espère que vous pouvez m'aider, merci d'avance! P>
3 Réponses :
Vous pouvez utiliser sequnceequal code> avec linq
SELECT CODE> comme celui-ci:
class Card
{
public int CardId { get; set; }
}
Assert.IsTrue(new[] { new Card {CardId = 1}, new Card {CardId = 2}}
.Select(c => c.CardId)
.SequenceEqual(new[] {1,2}));
Merci beaucoup d'avoir apporté à mon attention, je n'étais pas encore au courant de cette option. Je voulais utiliser une expression de Lambda pour accéder aux ID de la carte, mais je ne pouvais pas savoir comment mettre en œuvre cela dans la syntaxe d'affirmation. Sélectionnez résolu ce problème, tellement merci! J'ai enfin un test d'unité simple et lisse sans utiliser des boucles ni une autre logique lourde ou de longues lignes de code. Merci! Le test de l'unité ressemble maintenant à ceci: var pont = nouveau pont (); Var idlist = pont.select (CRD => CRD.ID); Affirmer.That (idlist, is.unique); code>
@Merelvandenhurk était heureux d'aider!
Pour déterminer si les cartes sont dans le même ordre en utilisant la propriété Vous pouvez également remplacer Notre code de comparaison est légèrement plus simple: p> ID code>, vous pouvez simplement sélectionner cette propriété dans un
ienumerable code>, puis utilisez le système
. .Linq code> Méthode d'extension
séquenceequal code> sur eux:
égal code> et
et
Gethashcode code> sur la classe code> code>, puis utilisez que em> pour la comparaison sur l'égalité. Cela vous aidera à aider avec d'autres comparaisons de cartes qui peuvent être nécessaires: p>
Merci pour votre exemple clair et votre explication! Je n'étais pas au courant de Select, qui a également été suggéré ci-dessus, qui a résolu mon problème. J'avais utilisé des expressions Lambda dans une autre partie du code pour obtenir la somme des valeurs de la carte, mais ne pouvions pas savoir comment la mettre en œuvre ici. Sélectionnez résolu ce problème, tant de merci à vous et à Guru Stron. Je ne suis pas familier avec des équivalions et des gethascodes de remplacement et je suis relativement nouveau à la programmation, alors en lisant votre exemple, je ne suis pas tout à fait sûr de ce qu'il fait précisément, comment cela modifie les méthodes d'origine. Cela vous dérangeriez-vous d'élaborer à ce sujet? Merci d'avance!
est égal à code> est utilisé dans de nombreux endroits, y compris la méthode
séquenceequale code> pour déterminer si deux objets sont identiques. La mise en œuvre par défaut (
objet .Equals code>
) utilise referequals code>, qui renvoie
true code> uniquement si deux objets sont tous deux en référence à la même chose. En remplacement
égale code>, nous modifions ce comportement pour notre classe - dans le code ci-dessus, nous retournons
true code> si les deux objets ont la même propriété code> ID code>.
gethashcode code> est une méthode d'accompagnement sur
égale code>, et une façon d'y penser est qu'il peut être utilisé pour déterminer si deux objets sont pas I> b> égale - il retournera toujours le même numéro pour deux objets que sont i> égaux, mais il est possible que deux objets ne sont pas i> égaux peuvent avoir le même code de hachage. Il devrait toujours être remplacé si
est égal à code> est remplacé (car il doit utiliser les mêmes propriétés du code de hachage, comme l'est utilisé pour déterminer l'égalité).
Merci pour votre réponse rapide, c'est vraiment plus clair pour moi maintenant. Donc, au lieu de comparer la référence, ce qui ferait une unique des objets, il compare le ID code> maintenant. Je suppose que je peux construire plus de substitution / surcharges si je veux aussi pouvoir utiliser
égale code> pour les autres propriétés, telles que la valeur et le costume? Ou éventuellement avec un interrupteur interne?
est égal à code> est utilisé uniquement pour comparer le type. Vous pouvez ajouter d'autres propriétés à l'évaluation, mais si vous souhaitez simplement comparer la valeur code> code> ou
de code> de différentes cartes, vous feriez simplement cette comparaison directement - comme: < Code> if (cardone.suit == cardtwo.suit) code> ou
si (cardone.value == cardtwo.value) code>.
Bien sûr, bien sûr. Merci encore pour la réponse rapide!
L'approche la plus simple pour votre cas à l'aide de fonctionnalités de Nunit n'est
Assert.That(shuffled, Is.EqualTo(DECK_SIZE); Assert.That(shuffled, Is.Unique); Assert.That(shuffled, Is.Not.EqualTo(unshuffled));
"Évidemment, les cartes sont des objets uniques, même s'ils contiennent les mêmes valeurs" i> vous pouvez contourner cela en remplaçant le
Equals code> et
gethascode code> méthodes Sur la classe CODE> CARD CODE>, puis vous pouvez simplement utiliser
Sequensequals code> pour comparer les deux listes.