10
votes

Nunit Assert.Equals Qu'est-ce que je manque?

ASSERT.EQUAIRE () N'appelle jamais

public class Entity 
{
  public int ID { get; set; }
}

var objectA = new Entity() { ID = 1 };
var objectB = new Entity() { ID = 1 };


3 commentaires

J ai exactement le même problème. Pour l'instant j'utilise assert.istrue (objectea.equals (objetb));


J'ai le même problème et j'ai déterminé que cela fonctionne si les objets que je comparais sont pas la même référence. Créez 2 objets avec différentes propriétés à l'écart des propriétés de l'égalité par rapport, alors affirmez.Equals fonctionne ... si la même référence est comparée (qui sont sûrement égales), alors il échoue! Comme n'étant pas égal (Nunit 2.5)


Vous recherchez assert.Areeequal (obja, objb);


5 Réponses :


9
votes

Utilisez assert.arequal (A, B) pour les types de valeur, assert.Areesame (A, B) pour les types de référence. http://www.nunit.org/index.php?p= IdentitySerserS & R = 2.2.7


3 commentaires

Cela dit toujours qu'ils ne sont pas les mêmes pour une raison quelconque. (Il n'appellera pas mes méthodes égales) :( ce que j'essaie de tester est 2 cas de la même classe avec le même identifiant qui devrait dire oui, ils sont égaux.


Pas sûr, vous pourriez certainement faire assert.Irue (ObjectA == objetb) mais je ne sais pas pourquoi vous devez.


ASSERT.AREESAME (A, B) Effectue réellement Réfalaires (A, B) , et pourrait ne pas être ce que vous recherchez. Si vous souhaitez affirmer la même instance d'objet, utilisez cette méthode. Sinon, vous pouvez mieux utiliser assert.arequal (A, B) à la place.



3
votes

Certains cadres permettent à l'égalité de fonctionner différemment avant l'attribution de l'ID (c'est-à-dire que l'entité est non sauvegardée) que l'après-guerre, lorsque cela est clair que l'intention est que l'ID d'entité est la base unique de la qualité. Utilisez-vous une sorte de cadre ou est-ce une entité votre propre classe?

Si c'est votre propre classe, pouvez-vous montrer à la gist de votre équivalence () logique?

acclamations, Berryl

FYI Assert.Aresame n'est jamais un test de valider votre implémentation de IEQUABLE! Voir les referéquents dans votre aide doc pour comprendre que l'assertion est meilleure.


1 commentaires

+1 pour "ASSERT.AREESAME n'est jamais un test de valider votre implémentation d'IEQUABLE"



1
votes

Il devrait fonctionner (voir cette question associée ) si le La méthode des égaux a été remplacée correctement. Pourrait-il s'agir d'un problème avec la méthode de votre équation (bien que si cela consiste simplement en une comparaison int, je ne le penserais pas)? Pourrait valoir la peine de définir un point de rupture dans votre méthode Equals, puis d'exécuter le test pour voir ce qui se passe dans les coulisses.


0 commentaires

4
votes

Vous êtes certainement correct. Je luttais avec un similaire Problème plus tôt aujourd'hui, jusqu'à ce que je trouvais votre message et que je suis maintenant sûr que Nunit Isequalto () n'appellera pas systématiquement les suppléments d'équivalents fournis.

Je dis systématiquement, parce que parfois ça fait. En fait, j'ai deux classes. Le second dérivé du premier. Lorsque j'appelle IS.equalto () sur les instances du premier, Nunit appelle les substitutions de l'équivalence, car les instances de la seconde, elle ne le fait pas.

tandis que c'est très particulier, je n'ai pas le temps d'enquêter plus loin dans Ce qui se passe?

Les personnes ayant des problèmes ou des solutions similaires devraient définitivement publier à ce sujet, car c'est une chose très gênante et je me fais en réalité douter de la validité de mes tests.

Entre-temps, j'ai créé la classe d'affirmation suivante, qui appelle à l'égal de l'équivalence (je l'ai vérifiée). Il utilise Nunit pour faire une simple égalité affirmée au lieu d'être.equalto () et quelque peu recours le fait que cette façon Nunit n'abandonne pas les représentations de chaîne des objets au cas où le test échoue.

donc ici c'est: xxx

l'utiliser comme ceci: xxx

et xxx

Hope this helps.


4 commentaires

Juste pour la complétude: comme on peut le voir dans votre message d'origine ( Stackoverflow.com/questions/1624848/... ), votre problème a été causé par un bogue dans votre dominuer objet.equals (objet). (Je suppose que le problème de l'opération de ce fil a été causé par un bug similaire.)


@Fabianschmied Je ne pense pas que cela soit dû au bug de la méthode des égaux, car il déclare que Nunit n'appelle même jamais sa méthode égale. Je suis venu ici avec le même problème. Ça n'aura pas d'importance ce que je change dans la méthode des égaux si ce n'est pas appelé par Nunit


J'ai le même problème mais mon test a fonctionné avant que j'ai mis en œuvre est égal à la classe moi-même. Quelque chose doit avoir convaincu Nunit de pas appeler ma méthode des égaux, maintenant que j'en ai un. Je ne pense pas que je suis prêt à enquêter sur le code, car je peux le faire fonctionner en utilisant ASSERT.Indrue (Obj1.equals (Obj2))


@Pandawood Thorsten Lorenz 'Exemple avait deux Equals Méthodes: une qui prend un paramètre de type objet , une qui prend un paramètre d'un type de classe de base. Nunit appelé celui avec type objet . Cette méthode comportait un bogue: il contenait une vérification de type ne comptant pas les sous-classes. La solution consiste à résoudre ce type de vérification. Voir le réponse acceptée .



1
votes

Vous voudrez peut-être consulter cette question: Inférences de Nunit.Qui lance une exception "Assert.equals ne doit pas être utilisé pour des assertions"

tl; dr; assert.equals (obj1, obj2) est remplacé par Nunit et jette une exception. Vous devez utiliser assert.Areequal (obj1, obj2) à la place.


0 commentaires