0
votes

Comment tester si deux collections d'objets sont dans un ordre différent basé sur l'un des propriétés des objets?

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.

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à.

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.

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.

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!


1 commentaires

"Évidemment, les cartes sont des objets uniques, même s'ils contiennent les mêmes valeurs" vous pouvez contourner cela en remplaçant le Equals et gethascode méthodes Sur la classe CARD , puis vous pouvez simplement utiliser Sequensequals pour comparer les deux listes.


3 Réponses :


2
votes

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}));


2 commentaires

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);


@Merelvandenhurk était heureux d'aider!



2
votes

Pour déterminer si les cartes sont dans le même ordre en utilisant la propriété ID , vous pouvez simplement sélectionner cette propriété dans un ienumerable , puis utilisez le système . .Linq Méthode d'extension séquenceequal sur eux: xxx


Vous pouvez également remplacer égal et et Gethashcode sur la classe , puis utilisez que pour la comparaison sur l'égalité. Cela vous aidera à aider avec d'autres comparaisons de cartes qui peuvent être nécessaires: xxx

Notre code de comparaison est légèrement plus simple: xxx


6 commentaires

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 à est utilisé dans de nombreux endroits, y compris la méthode séquenceequale pour déterminer si deux objets sont identiques. La mise en œuvre par défaut ( objet .Equals ) utilise referequals , qui renvoie true uniquement si deux objets sont tous deux en référence à la même chose. En remplacement égale , nous modifions ce comportement pour notre classe - dans le code ci-dessus, nous retournons true si les deux objets ont la même propriété ID .


gethashcode est une méthode d'accompagnement sur égale , et une façon d'y penser est qu'il peut être utilisé pour déterminer si deux objets sont pas égale - il retournera toujours le même numéro pour deux objets que sont égaux, mais il est possible que deux objets ne sont pas égaux peuvent avoir le même code de hachage. Il devrait toujours être remplacé si est égal à 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 maintenant. Je suppose que je peux construire plus de substitution / surcharges si je veux aussi pouvoir utiliser égale pour les autres propriétés, telles que la valeur et le costume? Ou éventuellement avec un interrupteur interne?


est égal à 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 ou de de différentes cartes, vous feriez simplement cette comparaison directement - comme: < Code> if (cardone.suit == cardtwo.suit) ou si (cardone.value == cardtwo.value) .


Bien sûr, bien sûr. Merci encore pour la réponse rapide!



1
votes

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));


0 commentaires