Logo Dallington Augusto

  • Home
  • Artigos
  • Sobre

Jest para Iniciante: Jest Matchers

Este artigo foi publicado em 16/08/2022, e leva aproximadamente 4 minutos para ler.

Introdução

Jest usa “matchers” para permitir que você teste valores de maneiras diferentes. A maioria das informações nesta parte é retirada dos documentos do Jest.

Correspondentes comuns

A maneira mais simples de testar um valor é com igualdade exata (toBe).

// expect(expectativa).toBe(correspondente);
test('5 mais 5 é igual a 10', () => {
  expect(5 + 5).toBe(10);
});

Neste código, expect(5 + 5) retorna um objeto “expectativa”. Você normalmente não fará muito com esses objetos de expectativa, exceto chamar correspondentes neles.
Neste código, .toBe(10) é o correspondente. Quando o Jest é executado, ele rastreia todos os matchers com falha para que possa imprimir boas mensagens de erro para você.

Em outras palavras, a expressão acima pode ser lida mais ou menos assim: espero que essa expresssão (5+5) seja (10).

toBe usa “Object .is” para testar a igualdade exata. Se você quiser verificar o valor de um objeto, use toEqual:

toEqual recursivamente verifica cada campo de um objeto ou array.

test('object assignment', () => {
  const data = {one: 1};
  data['two'] = 2;
  expect(data).toEqual({one: 1, two: 2});
});

Você também pode testar o oposto (.not) de um matcher:

test('adiciona numeros positivos que não são zero', () => {
  for (let a = 1; a < 10; a++) {
    for (let b = 1; b < 10; b++) {
      expect(a + b).not.toBe(0);
    }
  }
});

1. Veracidade

Em testes, às vezes você precisa distinguir entre indefinido, nulo e falso. Jest contém ajudantes que permitem que você seja explícito sobre o que deseja.

  • toBeNull corresponde apenas a nulo
  • toBeUndefined corresponde a apenas undefined
  • toBeDefined o oposto de toBeUndefined
  • toBeTruthy corresponde a qualquer coisa que uma instrução if trata como verdadeira
  • toBeFalsy corresponde a qualquer coisa que uma instrução if trata como falsa

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();
});
 PASS  __test__/sum.test.js
  √ nulo (2 ms)
  √ zero

Test Suites: 1 passed, 1 total
Tests:       2 passed, 2 total
Snapshots:   0 total
Time:        0.356 s, estimated 1 s

Nota: use o matcher que corresponda mais precisamente ao que você deseja que seu código faça.

2. Números

O Jest fornece diferentes matchers para comparar números.

test('quatro mais quatro', () => {
  const value = 4 + 4;
  expect(value).toBeGreaterThan(7);
  expect(value).toBeGreaterThanOrEqual(7.5);
  expect(value).toBeLessThan(9);
  expect(value).toBeLessThanOrEqual(8.5);

  // são equivalentes para números
  expect(value).toBe(8);
  expect(value).toEqual(8);
});
  • toBeGreaterThan corresponde a ser maior (>)
  • toBeGreaterThanOrEqual corresponde a ser maior ou igual(>=)
  • toBeLessThan corresponde a ser menor(<)
  • toBeLessThanOrEqual corresponde a a ser menor ou igual(<=)

Para igualdade de ponto flutuante, use toBeCloseTo em vez de toEqual, porque você não quer que um teste dependa de um pequeno erro de arredondamento para entender esse erro clique aqui.

test('adicionando números de ponto flutuante', () => {
  const value = 0.1 + 0.2;
  
  // Isso não vai funcionar por causa de um erro de arredondamento
 // expect(value).toBe(0.3);     
 
  expect(value).toBeCloseTo(0.3); // Isso funciona.
});

3. Strings

Jest fornece a facilidade de verificar strings em expressões regulares com toMatch:

test('não há I na palavra', () => {
  expect('Augusto').not.toMatch(/I/);
});

test('mas tem "ton" em Dallington', () => {
  expect('Dallington').toMatch(/ton/);
});
names.spec.js

4. Matriz e iteráveis

Você pode verificar se uma matriz(array) ou iterável(set) contém um item específico usando toContain :

const pokemon = [
  'Charizard',
  'Pikachu',
  'Bulbasaur',
  'Pidgeot',
  'Squirtle',
];

test('minha pokedex registrou', () => {
  expect(pokemon).toContain('Charizard');
  expect(new Set(pokemon)).toContain('Pikachu');
});
pokemon.spec.js

5. Exceções

Se você quiser testar se uma função específica gera um erro quando é chamada, o Jest fornece o matcher toThrow{.bg-gray-500 .text-gray-100}.

function registerPokemon(pokemon) {
   ...
  throw new Error('esse pokémon já foi registrado');
}

test('registra o pokémon na pokédex', () => {
  expect(() => registerPokemon('Charizard')).toThrow();
  expect(() => registerPokemon('Charizard')).toThrow(Error);

  //  Você também pode usar a mensagem exata de erro ou um regexp
  expect(() => registerPokemon('Charizard')).toThrow('esse pokémon já foi registrado');
  expect(() => registerPokemon('Charizard')).toThrow(/já foi/);
});
pokedex.spec.js

Nota: a função que lança uma exceção precisa ser invocada dentro de uma função de encapsulamento, caso contrário a asserção toThrow{.bg-gray-500 .text-gray-100} falhará.

Índice

  • Introdução
  • Correspondentes comuns
    • 1. Veracidade
    • 2. Números
    • 3. Strings
    • 4. Matriz e iteráveis

Gostou desse artigo ?

  • 🤩
  • 😑
  • 😒
  • Home
  • Artigos
  • Jardim
  • Sobre
  • Contato

Exceto onde indicado de outra forma, o conteúdo deste site é licenciado sob uma licença CC BY 4.0