Nuestro equipo especializado pasados varios días de investigación y recopilar de información, dimos con los datos necesarios, nuestro deseo es que te sea útil para tu plan.
Solución:
Para tipos primitivos (por ejemplo, números, booleanos, cadenas, etc.), no hay diferencia entre toBe
y toEqual
; cualquiera de los dos sirve para 5
, true
o "the cake is a lie"
.
Para entender la diferencia entre toBe
y toEqual
imaginemos tres objetos.
var a = bar: 'baz' ,
b = foo: a ,
c = foo: a ;
Usando una comparación estricta (===
), algunas cosas son “lo mismo”:
> b.foo.bar === c.foo.bar
true
> b.foo.bar === a.bar
true
> c.foo === b.foo
true
Pero algunas cosas, aunque sean “iguales”, no son “lo mismo”, ya que representan objetos que viven en diferentes lugares de la memoria.
> b === c
false
de jazmín toBe
Matcher no es más que un envoltorio para una comparación de igualdad estricta
expect(c.foo).toBe(b.foo)
es lo mismo que
expect(c.foo === b.foo).toBe(true)
No se limite a confiar en mi palabra; ver el código fuente de toBe.
Pero b
y c
representar objetos funcionalmente equivalentes; ambos se parecen
foo: bar: 'baz'
¿No sería genial si pudiéramos decir que b
y c
son “iguales” incluso si no representan el mismo objeto?
Ingresar toEqual
que comprueba la “igualdad profunda” (es decir, realiza una búsqueda recursiva a través de los objetos para determinar si los valores de sus keys son equivalentes). Pasarán las dos pruebas siguientes:
expect(b).not.toBe(c);
expect(b).toEqual(c);
Espero que ayude a aclarar algunas cosas.
toBe()
versus toEqual()
: toEqual()
equivalencia de cheques. toBe()
por otro lado, se asegura de que sean exactamente el mismo objeto.
yo diria usar toBe()
al comparar valores, y toEqual()
al comparar objetos.
Al comparar tipos primitivos, toEqual()
y toBe()
dará el mismo resultado. Al comparar objetos, toBe()
es una comparación más estricta, y si no es exactamente el mismo objeto en la memoria, esto devolverá false. Entonces, a menos que quiera asegurarse de que sea exactamente el mismo objeto en la memoria, use toEqual()
para comparar objetos.
Consulte este enlace para obtener más información: http://evanhahn.com/how-do-i-jasmine/
Ahora, al mirar la diferencia entre toBe()
y toEqual()
cuando se trata de números, no debería haber ninguna diferencia siempre que su comparación sea correcta. 5
siempre será equivalente a 5
.
Un buen lugar para jugar con esto para ver diferentes resultados es aquí.
Actualizar
Una manera fácil de mirar toBe()
y toEqual()
es entender qué hacen exactamente en JavaScript. Según Jasmine API, que se encuentra aquí:
toEqual() funciona para variables y literales simples, y debería funcionar para objetos
toBe() se compara con
===
Esencialmente lo que está diciendo es toEqual()
y toBe()
son javascripts similares ===
operador excepto toBe()
también está comprobando para asegurarse de que es exactamente el mismo objeto, en el ejemplo a continuación objectOne === objectTwo //returns false
así como. Sin embargo, toEqual()
regresará true en esa situación.
Ahora, al menos puedes entender por qué cuando se da:
var objectOne =
propertyOne: str,
propertyTwo: num
var objectTwo =
propertyOne: str,
propertyTwo: num
expect(objectOne).toBe(objectTwo); //returns false
Esto se debe a que, como se indica en esta respuesta a una pregunta diferente pero similar, el ===
En realidad, el operador significa que ambos operandos hacen referencia al mismo objeto o, en el caso de tipos de valor, tienen el mismo valor.
Para citar el proyecto jasmine github,
expect(x).toEqual(y);
compara objetos o primitivas x e y y pasa si son equivalentes
expect(x).toBe(y);
compara objetos o primitivas x e y y pasa
si son el mismo objeto