Using 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
uses Object.is
to test exact equality. If you want to check the value of an object, use toEqual
instead:
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.
Você também pode testar o oposto de um "matcher":
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
In tests, you sometimes need to distinguish between undefined
, null
, and false
, but you sometimes do not want to treat these differently. 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 and iterables
You can check if an array or iterable contains a particular item using 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
If you want to test whether a particular function throws an error when it's called, 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 the exact error message or a regexp
expect(() => compileAndroidCode()).toThrow('you are using the wrong JDK');
expect(() => compileAndroidCode()).toThrow(/JDK/);
});
Note: the function that throws an exception needs to be invoked within a wrapping function otherwise the
toThrow
assertion will fail.
E muito mais
This is just a taste. Para a lista completa de matchers, dê uma olhada em reference docs.
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.