Disons que j'ai les éléments suivants:
var myNumber = 5;
expect(myNumber).toBe(5);
expect(myNumber).toEqual(5);
Les deux tests ci-dessus réussiront. Y a-t-il une différence entre toBe()
et toEqual()
quand il s'agit d'évaluer des chiffres? Si oui, quand devrais-je utiliser l'un et pas l'autre?
javascript
jasmine
Lloyd Banks
la source
la source
toEqual()
comparera par clé / contenu de valeurs;toBe()
comparera par référence d'objet.Réponses:
Pour les types primitifs (par exemple les nombres, les booléens, les chaînes, etc.), il n'y a pas de différence entre
toBe
ettoEqual
; soit on va travailler pour5
,true
ou"the cake is a lie"
.Pour comprendre la différence entre
toBe
ettoEqual
, imaginons trois objets.En utilisant une comparaison stricte (
===
), certaines choses sont "les mêmes":Mais certaines choses, même si elles sont «égales», ne sont pas «les mêmes», car elles représentent des objets qui vivent à différents endroits de la mémoire.
Le
toBe
matcher de Jasmine n'est rien de plus qu'un wrapper pour une comparaison stricte d'égalitéc'est la même chose que
Ne vous fiez pas seulement à ma parole; voir le code source de toBe .
Mais
b
etc
représentent des objets fonctionnellement équivalents; ils ressemblent tous les deuxNe serait-il pas formidable de dire cela
b
et d'c
être "égaux" même s'ils ne représentent pas le même objet?Enter
toEqual
, qui vérifie "l'égalité profonde" (c'est-à-dire effectue une recherche récursive dans les objets pour déterminer si les valeurs de leurs clés sont équivalentes). Les deux tests suivants réussiront:J'espère que cela clarifie certaines choses.
la source
expect(0).toBe(-0)
passera maisexpect(0).toEqual(-0)
échouera.toBe
utilise une égalité stricte - compare par référence,toEqual
utilise l'équivalence des propriétés. RecommandétoEqual
pour les primitivestoEqual
est beaucoup plus prudent sur l' égalité (0 != -0
,"hi" = new String("hi")
, etc.), donc je vous recommande d' utilisertoEqual
exclusivement à moins que vous êtes réellement préoccupé par l' équivalence de référence. Voir toutes les vérifications effectuéestoEqual
dans laeq
méthode ici: github.com/jasmine/jasmine/blob/master/src/core/matchers/…toBe()
versustoEqual()
:toEqual()
vérifie l'équivalence.toBe()
, d'autre part, s'assure qu'ils sont exactement le même objet.Je dirais utiliser
toBe()
lors de la comparaison de valeurs ettoEqual()
lors de la comparaison d'objets.Lors de la comparaison des types primitifs,
toEqual()
ettoBe()
donnera le même résultat. Lorsque vous comparez des objets,toBe()
c'est une comparaison plus stricte, et si ce n'est pas exactement le même objet en mémoire, cela retournera faux. Donc, sauf si vous voulez vous assurer qu'il s'agit exactement du même objet en mémoire, utilisez-letoEqual()
pour comparer les objets.Consultez ce lien pour plus d'informations: http://evanhahn.com/how-do-i-jasmine/
Maintenant, quand on regarde la différence entre
toBe()
ettoEqual()
quand il s'agit de chiffres, il ne devrait pas y avoir de différence tant que votre comparaison est correcte.5
sera toujours équivalent à5
.Un bon endroit pour jouer avec cela pour voir différents résultats est ici
Mise à jour
Un moyen facile de regarder
toBe()
ettoEqual()
de comprendre ce qu'ils font exactement en JavaScript. Selon l'API Jasmine, trouvée ici :Essentiellement, ce que cela signifie est
toEqual()
ettoBe()
sont des===
opérateurs Javascripts similaires , sauf qu'iltoBe()
vérifie également pour s'assurer qu'il s'agit exactement du même objet, dans celui de l'exemple ci-dessousobjectOne === objectTwo //returns false
également. Cependant,toEqual()
reviendra vrai dans cette situation.Maintenant, vous pouvez au moins comprendre pourquoi une fois donné:
expect(objectOne).toBe(objectTwo); //returns false
En effet, comme indiqué dans cette réponse à une question différente mais similaire, l'
===
opérateur signifie en fait que les deux opérandes font référence au même objet ou, dans le cas de types de valeur, ont la même valeur.la source
toEqual()
signifie le fait detoEqual()
vérifier l'équivalence , mais la question suivante évidente est correcte, alors que signifie «équivalent»? Une description de l'algorithme utilisé pour déterminer «l'équivalence», ou au moins des exemples de cas où le comportement detoEqual()
ettoBe()
diffèrent, rendrait cela plus utile.toEqual
devrait être utilisé pour une comparaison approfondie entre les objets, nontoBe
. jsfiddle.net/bBL9P/67toEqual
n'est pas du tout le même que==
.expect(1).toEqual('1')
échoue, alors que1 == '1'
c'est vrai.toEqual
n'a rien à voir avec==
. C'est comme===
sauf qu'il comparera les objets d'une manière similaire à la comparaison par valeur.Pour citer le projet jasmine github,
la source
En regardant le code source de Jasmine, nous éclairons davantage le problème.
toBe
est très simple et utilise simplement l'identité / opérateur d'égalité stricte,===
:toEqual
, D'autre part, est près de 150 lignes de long et a un traitement spécial pour les objets comme construitString
,Number
,Boolean
,Date
,Error
,Element
etRegExp
. Pour les autres objets, il compare récursivement les propriétés.Ceci est très différent du comportement de l'opérateur d'égalité,
==
. Par exemple:la source
toEqual()
compare les valeurs si Primitive ou le contenu si Objects.toBe()
compare les références.Le code / suite suivant doit être explicite:
la source
Je pensais que quelqu'un pourrait aimer une explication par un exemple (annoté):
Ci-dessous, si ma fonction deepClone () fait bien son travail, le test (comme décrit dans l'appel 'it ()') réussira:
Bien sûr, ce n'est pas une suite de tests complète pour mon deepClone (), car je n'ai pas testé ici si l'objet littéral dans le tableau (et celui qui y est imbriqué) ont également une identité distincte mais les mêmes valeurs.
la source
Je pense que toEqual vérifie profondément égal, toBe est la même référence de 2 variables
la source
Points à noter:
toBe()
traite les comparaisons comme commentObject.is()
.toEqual()
traite les comparaisons comme comment===
.C'est pourquoi pour les types primitifs,
toBe
ettoEqual
il n'y a pas beaucoup de différence lors du test d'égalité, mais pour les types de référence comme les objets, vous préférez utilisertoEqual
pour tester l'égalité.la source