Qual é a diferença entre expect(something).toBe(true)
, expect(something).toBeTruthy()
e expect(something).toBeTrue()
?
Observe que toBeTrue()
é um combinador personalizado introduzido jasmine-matchers
entre outros combinadores úteis e úteis, como toHaveMethod()
ou toBeArrayOfStrings()
.
A pergunta deve ser genérica, mas, como um exemplo do mundo real, estou testando se um elemento é exibido protractor
. Qual fósforo devo usar neste caso?
expect(elm.isDisplayed()).toBe(true);
expect(elm.isDisplayed()).toBeTruthy();
expect(elm.isDisplayed()).toBeTrue();
.toBe(true)
==.toBeTrue()
. toBeTruthy () pode ser verdadeiro não apenas sobre true , mas sobre 123 , "dfgdfg", [1,2,3], etc ... basicamente são verdadeirosif(x==true)
, enquantoif(x===true)
são verdadeiros verdadeiros.toBeTruthy
se você não tiver certeza do tipo, é o mesmo que,== true
enquanto eu suspeito,.toBe(true)
é o mesmo que=== true
você mente, é um pouco exagerado chamar uma função para testar se é verdade. Palavra de conselho,. Esquecer==
e!=
existir em Javascript e nunca mais usá-lo. A verdade não é necessária e é uma armadilha para iniciantes. Use===
e em!==
vez disso.eslint
relatórios se==
ou!=
são usados sugerindo alterá-lo para===
e!==
.Respostas:
O que faço quando me pergunto algo como a pergunta feita aqui é ir à fonte.
ser estar()
expect().toBe()
é definido como:Ele realiza seu teste com o
===
que significa que, quando usado comoexpect(foo).toBe(true)
, passará apenas sefoo
realmente tiver o valortrue
. Valores reais não farão o teste passar.toBeTruthy ()
expect().toBeTruthy()
é definido como:Coerção de tipo
Um valor é verdadeiro se a coerção desse valor para um booleano produz o valor
true
. A operação!!
testa a veracidade coagindo o valor passadoexpect
para um booleano. Observe que, ao contrário do que a resposta atualmente aceita implica , não== true
é um teste correto para a veracidade. Você terá coisas engraçadas comoConsiderando que usando
!!
rendimentos:(Sim, vazio ou não, uma matriz é verdadeira.)
ser verdadeiro()
expect().toBeTrue()
faz parte do Jasmine-Matchers (que é registrado no npm comojasmine-expect
após um projeto posterior registradojasmine-matchers
primeiro).expect().toBeTrue()
é definido como:A diferença com
expect().toBeTrue()
eexpect().toBe(true)
é queexpect().toBeTrue()
testa se está lidando com umBoolean
objeto.expect(new Boolean(true)).toBe(true)
falharia enquantoexpect(new Boolean(true)).toBeTrue()
passaria. Isso é por causa dessa coisa engraçada:Pelo menos é verdade:
Qual é o mais adequado para uso
elem.isDisplayed()
?Em última análise, o transferidor entrega esse pedido ao Selenium. A documentação afirma que o valor produzido por
.isDisplayed()
é uma promessa que resolve para aboolean
. Eu aceitaria pelo valor de face e usaria.toBeTrue()
ou.toBe(true)
. Se eu encontrasse um caso em que a implementação retornasse valores verdadeiros / falsos, eu arquivaria um relatório de erro.fonte
Em javascript, existem verdades e verdades. Quando algo é verdadeiro, é obviamente verdadeiro ou falso. Quando algo é verdade, pode ou não ser um booleano, mas o valor "cast" de é um booleano.
Exemplos.
Isso pode simplificar as coisas se você quiser verificar se uma sequência está definida ou se uma matriz possui algum valor.
E como indicado.
expect(something).toBe(true)
eexpect(something).toBeTrue()
é o mesmo. Masexpect(something).toBeTruthy()
não é o mesmo que qualquer um deles.fonte
[] == false;
não é correto, a própria afirmação é falsa porque os objetos são sempre truthy[] == false;
étrue
[""]==false
ou[0]== false
; não está vazio, não Falsey, apenas enganosa ...x == true
que você usa em seus exemplos é uma maneira enganosa e, como mostram os comentários acima, de uma maneira incorreta de ilustrar o conceito de veracidade no JavaScript. O verdadeiro teste de veracidade no JavaScript é como um valor se comporta em umaif
declaração ou como um operando em uma expressão booleana. Sabemos que1
é verdade porqueif (1)
fará com que a próxima declaração seja avaliada. Da mesma forma,[]
é verdade pelo mesmo motivo: Embora seja[] == true
avaliado comofalse
,if ([])
ainda fará com que a próxima declaração seja avaliada, portanto sabemos que[]
é verdade.Eu sei que todo mundo adora uma lista fácil de ler:
toBe(<value>)
- O valor retornado é o mesmo que<value>
toBeTrue()
- Verifica se o valor retornado étrue
toBeTruthy()
- Verifique se o valor, quando convertido em um booleano, será um valor verdadeiroTruthy valores são todos os valores que não são
0
,''
(de cadeia vazio),false
,null
,NaN
,undefined
ou[]
(matriz vazia) *.* Observe que, quando você executa
!![]
, ele retornatrue
, mas quando você executa[] == false
, também retornatrue
. Depende de como é implementado. Em outras palavras:(!![]) === ([] == false)
No seu exemplo,
toBe(true)
etoBeTrue()
produzirá os mesmos resultados.fonte
alert(!![])
[] == true
no seu console produzfalse
.[] == false
em seu console produztrue
Existem muitas respostas boas por aí, eu só queria adicionar um cenário em que o uso dessas expectativas possa ser útil. Usando
element.all(xxx)
, se eu precisar verificar se todos os elementos são exibidos em uma única execução, eu posso executar -Razão de ser
.all()
retorna uma matriz de valores e assim todos os tipos de expectativas (getText
,isPresent
, etc ...) pode ser realizada comtoBeTruthy()
quando.all()
entra em cena. Espero que isto ajude.fonte
reduce()
colocar a matriz de booleanos em um único valor e depois aplicar atoBe(true)
verificação. Isso é muito mais simples, obrigado.