Uma parte legal do Jasmine e que adianta muito o nosso lado são os matchers: de um modo resumido e direto, um matcher implementa uma comparação booleana entre o valor atual e o valor esperado. É responsável em passar para o framework se o que esperamos através do nosso teste é verdadeiro ou falso. Com base nisso, o Jasmine vai passar ou falhar a spec.
toEqual
Esse talvez seja o mais básico e um dos que mais iremos usar. Simplemente verifica se duas coisas são iguais (e não necessariamente o mesmo objeto). Por exemplo, as seguintes expects iriam passar:
Da mesma forma, as seguintes iriam falhar:
toBe
O matcher toBe
a princípio parece ser igual ao anterior toEqual
. A diferença é que toBe
verifica não só se os dois valores são iguais, mas também como se eles são do mesmo objeto.
Pra podermos ver a diferença entre os dois:
Apesar de bob e john serem similares, eles não são o mesmo objeto, o que faz a spec passar se for usado o matcher toEqual mas falha se for usado o matcher toBe
. O mesmo acontece para arrays:
toBeTruthy e toBeFalsy
Para testar se algum valor é avaliado commo true ou false, podemos usar respectivamente os matchers toBeTruthy
e toBeFalsy
:
Se pararmos pra olhar com calma o exemplo anterior podemos notar que a avaliação dos matchers toBeTruthy
e toBeFalsy
é idêntica ao JavaScript. Então temos alguns valores específicos que são considerados falsy e todo o restante é avaliado como truthy. Pra nossa referência, uma lista dos valores que são avaliados como falsy pelo Jasmine:
-
false
-
****
-
“”
-
undefined
-
null
-
NaN
not
Muitas vezes podemos inverter um matcher pra termos certeza de que ele não é um valor true. Podemos fazer isso facilmente adicionando o prefixo .not
:
toContain
Conseguimos também verificar se um elemento está contido em um array ou string por exemplo, como o matcher toContain
.
toBeDefined e toBeUndefined
Da mesma maneira que vimos os matchers toBeTruthy
e toBeFalsy
, Jasmine também nos oferece os benditos toBeDefined
e toBeUndefined
que verificam se um valor é defined ou undefined.
toBeNull
Direto ao ponto, esse brother simplesmente avalia se um valor é null:
toBeNaN
Sem muitas delongas, esse matcher verifica se um valor é NaN:
toBeGreatherThan e toBeLessThan
Esses dois matchers verificam se um valor é maior ou menor que um outro valor passado.
toBeCloseTo
Esse matcher permite que possamos verificar se um certo número está próximo de um outro número, dado uma certa precisão decimal como segundo argumento. Poderíamos por exemplo, verificar se um número é próximo de 25.23 com um ponto decimal, poderíamos fazer algo assim:
toMatch
Esse cara verifica se algum valor está de acordo com base em uma expressão regular.
toThrow
Esse matcher permite que verifiquemos se uma função lançou um erro. Como exemplo, vamos imaginar que temos uma função onlyNumbers
que deve lançar uma exceção caso o argumento passado seja uma string e não um número. Podemos usar aqui uma função anônima para nos facilitar a vida:
Ufa…
Deu pra ver que o framework nos oferece um monte de opção para utilizarmos em nossos testes. É ainda é possível fazer nossos matchers customizados, mas vou deixar isso para um próximo post. Se você se interessar mais pelo assunto, recomendo o livro JavaScript Testing with Jasmine que inclusive li recentemente e tive a idéia de escrever o post.
Acho que é isso. Se encontrar algum erro ou melhoria no post, pode postar no comentário ou pode me chamar no twitter.