Usando Matchers
O Jest usa "matchers" para que você possa testar valores de maneiras diferentes. Este documento dará uma introdução de algumas diretrizes de uso de "matchers". Para ter a lista completa, veja expect
API doc.
Matchers Comuns
A maneira mais simples para testar um valor é com igualdade exata.
test('dois mais dois é quatro', () => {
expect(2 + 2).toBe(4);
});
Nesse código, expect(2 + 2)
retorna um objeto de "expectativa". Você normalmente não vai fazer muito com esses objetos de expectativa exceto chamada "matchers" neles. Nesse código, o .toBe(4)
é o "matcher". Quando Jest é executado, ele rastreia todos os "matchers" que falharam para que possa imprimir as mensagens de erro para você de uma forma agradável.
toBe
utiliza Object.is
para testar a igualdade exata. Se você quer checar o valor de um objeto, use toEqual
:
test('atribuição de objeto', () => {
const data = {one: 1};
data['two'] = 2;
expect(data).toEqual({one: 1, two: 2});
});
toEqual
recursivamente verifica cada campo de um objeto ou array.
toEqual
ignores object keys with undefined
properties, undefined
array items, array sparseness, or object type mismatch. To take these into account use toStrictEqual
instead.
You can also test for the opposite of a matcher using not
:
test('adicionando números positivos não é zero', () => {
for (let a = 1; a < 10; a++) {
for (let b = 1; b < 10; b++) {
expect(a + b).not.toBe(0);
}
}
});
Verdade
Em testes às vezes você precisa distinguir entre undefined
, null
e false
, mas às vezes você não quer tratar estes de maneira diferente. Jest contém auxiliares que permitem você ser explícito sobre o que quer.
toBeNull
corresponde a apenasnull
toBeUndefined
corresponde a apenasundefined
toBeDefined
é o oposto detoBeUndefined
toBeTruthy
combina com qualquer coisa que uma instruçãoif
trata como verdadeirotoBeFalsy
combina com qualquer coisa que uma instruçãoif
trata como falso
Por exemplo:
test('nulo', () => {
const n = null;
expect(n).toBeNull();
expect(n).toBeDefined();
expect(n).not.toBeUndefined();
expect(n).not.toBeTruthy();
expect(n).toBeFalsy();
});
test('zero', () => {
const z = 0;
expect(z).not.toBeNull();
expect(z).toBeDefined();
expect(z).not.toBeUndefined();
expect(z).not.toBeTruthy();
expect(z).toBeFalsy();
});
Você deve usar o "matcher" que corresponde mais precisamente para o que você deseja que seu código faça.
Números
A maioria das formas de comparar números têm "matcher" equivalentes.
test('dois mais dois', () => {
const value = 2 + 2;
expect(value).toBeGreaterThan(3);
expect(value).toBeGreaterThanOrEqual(3.5);
expect(value).toBeLessThan(5);
expect(value).toBeLessThanOrEqual(4.5);
// toBe e toEqual são equivalentes para números
expect(value).toBe(4);
expect(value).toEqual(4);
});
Para igualdade de ponto flutuante, use toBeCloseTo
em vez de toEqual
, porque você não quer um teste dependa de um pequeno erro de arredondamento.
test('adicionando números de ponto flutuante', () => {
const value = 0.1 + 0.2;
//expect(value).toBe(0.3); Isso não vai funcionar por causa de um erro de arredondamento
expect(value).toBeCloseTo(0.3); // Isso funciona.
});
Strings
Você pode verificar strings contra expressões regulares com toMatch
:
test('não existe I em team', () => {
expect('team').not.toMatch(/I/);
});
test('mas existe "stop" em Christoph', () => {
expect('Christoph').toMatch(/stop/);
});
Arrays e iteráveis
Você pode verificar se um array ou iterável contém um item específico usando toContain
:
const shoppingList = [
'diapers',
'kleenex',
'trash bags',
'paper towels',
'milk',
];
test('the shopping list has milk on it', () => {
expect(shoppingList).toContain('milk');
expect(new Set(shoppingList)).toContain('milk');
});
Exceções
Se você quiser testar se uma determinada função lança um erro quando é chamada, use toThrow
.
function compileAndroidCode() {
throw new Error('you are using the wrong JDK!');
}
test('compiling android goes as expected', () => {
expect(() => compileAndroidCode()).toThrow();
expect(() => compileAndroidCode()).toThrow(Error);
// You can also use a string that must be contained in the error message or a regexp
expect(() => compileAndroidCode()).toThrow('you are using the wrong JDK');
expect(() => compileAndroidCode()).toThrow(/JDK/);
// Or you can match an exact error message using a regexp like below
expect(() => compileAndroidCode()).toThrow(/^you are using the wrong JDK$/); // Test fails
expect(() => compileAndroidCode()).toThrow(/^you are using the wrong JDK!$/); // Test pass
});
The function that throws an exception needs to be invoked within a wrapping function otherwise the toThrow
assertion will fail.
E muito mais
Isto é só uma amostra. Para obter uma lista completa de "matchers", confira a documentação de referência.
Uma vez que você aprendeu sobre os "matchers" que estão disponíveis, um próximo passo é conferir como Jest permite que você teste código assíncrono.