Digamos que tenho o seguinte:
var myNumber = 5;
expect(myNumber).toBe(5);
expect(myNumber).toEqual(5);
Ambos os testes acima serão aprovados. Existe uma diferença entre toBe()
e toEqual()
quando se trata de avaliar números? Se sim, quando devo usar um e não o outro?
javascript
jasmine
Lloyd Banks
fonte
fonte
toEqual()
será comparado por conteúdo-chave / valores;toBe()
irá comparar por referência de objeto.Respostas:
Para tipos primitivos (por exemplo, números, booleanos, seqüências de caracteres, etc.), não há diferença entre
toBe
etoEqual
; qualquer um irá trabalhar para5
,true
ou"the cake is a lie"
.Para entender a diferença entre
toBe
etoEqual
, vamos imaginar três objetos.Usando uma comparação estrita (
===
), algumas coisas são "iguais":Mas algumas coisas, mesmo sendo "iguais", não são "iguais", pois representam objetos que vivem em diferentes locais da memória.
O
toBe
par de Jasmine não passa de um invólucro para uma comparação estrita de igualdadeé a mesma coisa que
Não basta aceitar minha palavra; veja o código fonte para toBe .
Mas
b
ec
representam objetos funcionalmente equivalentes; ambos se parecemNão seria ótimo se pudéssemos dizer isso
b
ec
"iguais", mesmo que não representem o mesmo objeto?Enter
toEqual
, que verifica "profunda igualdade" (ou seja, faz uma pesquisa recursiva nos objetos para determinar se os valores para suas chaves são equivalentes). Os dois testes a seguir serão aprovados:Espero que ajude a esclarecer algumas coisas.
fonte
expect(0).toBe(-0)
vai passar, masexpect(0).toEqual(-0)
vai falhar.toBe
usa igualdade estrita - compara por referência,toEqual
usa equivalência de propriedade. Recomendado para usotoEqual
em primitivostoEqual
é muito mais cuidadoso sobre a igualdade (0 != -0
,"hi" = new String("hi")
, etc.), então eu recomendo usartoEqual
exclusivamente a menos que você está realmente preocupado com a equivalência de referência. Veja todas as verificações realizadastoEqual
noeq
método aqui: github.com/jasmine/jasmine/blob/master/src/core/matchers/…toBe()
versustoEqual()
:toEqual()
verifica a equivalência.toBe()
, por outro lado, garante que eles sejam exatamente o mesmo objeto.Eu diria que use
toBe()
ao comparar valores etoEqual()
ao comparar objetos.Ao comparar tipos primitivos,
toEqual()
etoBe()
produzirá o mesmo resultado. Ao comparar objetos,toBe()
é uma comparação mais rigorosa e, se não for exatamente o mesmo objeto na memória, isso retornará falso. Portanto, a menos que você queira ter certeza de que é exatamente o mesmo objeto na memória, use-otoEqual()
para comparar objetos.Confira este link para mais informações: http://evanhahn.com/how-do-i-jasmine/
Agora, ao analisar a diferença entre
toBe()
etoEqual()
quando se trata de números, não deve haver nenhuma diferença, desde que sua comparação esteja correta.5
sempre será equivalente a5
.Um bom lugar para brincar com isso e ver resultados diferentes é aqui
Atualizar
Uma maneira fácil de ver
toBe()
etoEqual()
entender o que exatamente eles fazem em JavaScript. De acordo com a API do Jasmine, encontrada aqui :Essencialmente, o que isso está dizendo é
toEqual()
etoBe()
é um===
operador Javascripts semelhante , exceto quetoBe()
também está verificando se o objeto é exatamente o mesmo, no exemplo abaixoobjectOne === objectTwo //returns false
também. No entanto,toEqual()
retornará verdadeiro nessa situação.Agora, você pode pelo menos entender o porquê quando determinado:
expect(objectOne).toBe(objectTwo); //returns false
Isso ocorre porque, conforme declarado nesta resposta a uma pergunta diferente, mas semelhante, o
===
operador realmente significa que ambos os operandos referenciam o mesmo objeto ou, no caso de tipos de valor, têm o mesmo valor.fonte
toEqual()
que diz dizendo quetoEqual()
verifica a equivalência , mas a próxima pergunta óbvia é boa; então, o que significa "equivalente"? Uma descrição do algoritmo usado para determinar a "equivalência", ou pelo menos exemplos de casos em que o comportamentotoEqual()
e atoBe()
diferença diferem, tornariam isso mais útil.toEqual
deve ser usado para comparação profunda entre objetos, nãotoBe
. jsfiddle.net/bBL9P/67toEqual
é o mesmo que .==
expect(1).toEqual('1')
falha, enquanto1 == '1'
é verdade.toEqual
não tem nada a ver com==
. É como,===
exceto que ele compara objetos de maneira semelhante à comparação por valor.Para citar o projeto jasmine github,
fonte
Analisar o código fonte do Jasmine lança mais luz sobre o problema.
toBe
é muito simples e apenas usa o operador de identidade / igualdade estrita===
:toEqual
, Por outro lado, é aproximadamente 150 linhas de comprimento e tem um manuseamento especial para construído em objectos comoString
,Number
,Boolean
,Date
,Error
,Element
eRegExp
. Para outros objetos, ele compara recursivamente propriedades.Isso é muito diferente do comportamento do operador de igualdade
==
,. Por exemplo:fonte
toEqual()
compara valores se Primitivo ou conteúdo se Objetos.toBe()
compara referências.O código / conjunto a seguir deve ser auto-explicativo:
fonte
Pensei que alguém poderia gostar de explicação por exemplo (anotado):
Abaixo, se minha função deepClone () fizer seu trabalho corretamente, o teste (conforme descrito na chamada 'it ()') terá êxito:
É claro que esse não é um conjunto de testes completo para o meu deepClone (), pois não testei aqui se o objeto literal na matriz (e o aninhado nela) também possui identidade distinta, mas os mesmos valores.
fonte
Eu acho que toEqual está verificando profundamente igual, toBe é a mesma referência de 2 variáveis
fonte
Pontos a serem observados:
toBe()
trata comparações como comoObject.is()
.toEqual()
trata comparações como como===
.É por isso que para tipos primitivos,
toBe
etoEqual
não há muita diferença ao testar a igualdade, mas para tipos de referência como objetos, você prefere usartoEqual
para testar a igualdade.fonte