11
votes

Nunit ne fonctionne pas bien avec Assert.Areequal

Je suis nouveau à des tests unitaires et à la nuit en particulier. Je sais juste quelques exemples du livre qui fait référence à Java et Junit. Mais j'utilise c # à la place.

Le problème est le suivant: j'ai une classe avec des méthodes de substitution telles que égale () et gethascode () , mais quand J'essaie de comparer deux objets de cette classe avec assert.arequal () mon code n'est pas appelé, alors je reçois une exception.

assert.true (myClass .Equals (myClass2)) fonctionne bien. Mais je ne veux pas utiliser cette construction au lieu de assert.arequal () . Où peut-être le problème?

voici la classe: xxx

et la méthode de test elle-même: xxx


2 commentaires

Avez-vous essayé avec une substitution publique Bool Equals ()?


@Samuel - Correct, mais vous auriez besoin de changer le modificateur et le type I.E. Public Bool Supprimer est égal à ()


4 Réponses :


32
votes

Le problème est que vous êtes caché égaux, pas primer it. Bien fait - votre test de l'unité a trouvé un bogue :)

Votre code doit être: xxx

(Cela l'empêchera de lancer une exception si vous le faites mal Tapez aussi.)

J'ai fabriqué le test d'égalité des chaînes plus simple, la surcharge de l'opérateur peut être très utile :)

Au fait, vous voulez presque certainement:

  • Changer devise Pour être une propriété, pas une méthode
  • Ajouter un Montant Propriété
  • changez probablement le type de montant pour être décimal au lieu de int
  • Faites les champs privés et réadonnants
  • sceller la classe
  • Ajouter des surcharges sur l'opérateur pour == et! =
  • ajoutez éventuellement une surcharge d'opérateur * pour faire la même chose que fois
  • Évitez la formatage des chaînes lors du calcul du hachage (il existe des dizaines de réponses montrant de meilleures implémentations de hachage)

    Edit: Je viens de relire que vous utilisez un exemple d'un livre. Le livre se cache-t-il vraiment au lieu de remplacer le Equals ? Je vous suggère d'obtenir un nouveau livre, si oui (à moins que ce ne soit un exemple délibéré de quand c'est mauvais à utiliser caché!) ... Quel livre est-ce?


3 commentaires

C'est génial. Grand début à la journée.


Oui, c'est une décision! Merci beaucoup. J'ai lu "développement axé sur le test: par exemple" par Kent Beck. Les exemples sont écrits en Java, la définition de la méthode est la suivante: Bool public égal (objet d'objet); Mais j'écris C # Code, alors Ide-Helper m'a demandé si je voulais écrire "NOUVEAU PUBLIC NOOL BOOL EQUALES (objet O)" au lieu de "Bool Bool (Objet O)". Donc, c'est mon erreur, sans parler de toutes les solutions du problème. Bien que merci pour les astuces. Je les considérerai pour une expérience future;)


Ah, droite - tout va bien alors. Si c'était un livre C #, j'aurais été consterné :)



0
votes

Je soupçonne que votre problème est que vous n'avez pas remplacé par la surcharge de l'exploitant Equality ==. Sous la capuche, l'assert.Areequal utilise probablement ==.

voir Tutoriel de surcharge de l'opérateur . < / p>

mise à jour: j'ai couru le test de Nunit à travers le débogueur et utilise effectivement la méthode des égaux et non l'opérateur ==.


1 commentaires

Vous ne pouvez pas remplacer les opérateurs - vous ne pouvez que surcharge eux. Nunit presque certainement ne sera pas utiliser des opérateurs surchargés - c'est inutilement compliqué quand il peut simplement appeler égale à ...



1
votes

J'ai trouvé que cela confondre que la mise en œuvre de l'interface Iequatable, qui a également une méthode xxx pré>

, m'a posé avec le même problème que décrit ci-dessus. P>

la seule raison J'ai choisi d'utiliser l'interface Iéquible au-dessus du remplacement de la méthode des égaux n'était pas de devoir faire la vérification de type. P>

à la fin, je devais utiliser le code suivant P>

public bool Equals(CustomTag other)
{
   return (other.Name.Trim().ToLower() == Name.Trim().ToLower());
}

public override bool Equals(object o)
{
    if (o is CustomTag)
    {
        return Equals(o as CustomTag);
    }
    return false;
}


0 commentaires

0
votes

Vous pouvez écrire des affirmations agnostiques-cadres à l'aide d'une bibliothèque appelée. Il a également une très belle syntaxe fluide qui peut être utilisée si vous aimez des interfaces courantes. J'ai eu un poteau de blog sur la même chose.

http: //nilehgule.blogspot. COM / 2010/11 / utilisation-devoir-assertion-bibliothèque-to-write.html


0 commentaires