DEV Community

Cover image for Diferenças entre o jest.spyOn e jest.mock
Vitor Rios
Vitor Rios

Posted on

Diferenças entre o jest.spyOn e jest.mock

Sim, existem diferenças importantes entre jest.mock e jest.spyOn, embora ambos sejam usados para criar mocks em testes. Vamos explorar as diferenças e quando usar cada um.

jest.mock

Uso

jest.mock é usado para mockar módulos inteiros. Isso é útil quando você deseja substituir um módulo completo, seja ele uma biblioteca de terceiros ou um módulo local, com uma versão mockada.

Comportamento

Quando você usa jest.mock, Jest automaticamente substitui todas as funções exportadas pelo módulo mockado com versões mockadas.

Exemplos

// Suponha que temos um módulo `utils.js` com uma função `calculate`.
import { calculate } from './utils';

// Testando um componente que usa a função `calculate`.
import MyComponent from './MyComponent';

// Mocka o módulo `utils`.
jest.mock('./utils', () => ({
  calculate: jest.fn(),
}));

test('should call calculate function', () => {
  calculate.mockReturnValue(42);
  render(<MyComponent />);
  expect(calculate).toHaveBeenCalled();
});
Enter fullscreen mode Exit fullscreen mode

Quando Usar

Use jest.mock quando você quiser mockar todas as funções de um módulo ou quando quiser substituir completamente um módulo.

jest.spyOn

Uso

jest.spyOn é usado para espionar métodos em objetos. Isso é útil quando você deseja manter a implementação original do método, mas ainda assim observar como ele é chamado e/ou fornecer valores de retorno personalizados.

Comportamento

jest.spyOn cria uma versão mockada de uma função existente, permitindo que você mantenha a implementação original ou a substitua conforme necessário.

Exemplos

// Suponha que temos um módulo `utils.js` com uma função `calculate`.
import * as utils from './utils';

// Testando um componente que usa a função `calculate`.
import MyComponent from './MyComponent';

test('should call calculate function', () => {
  // Espiona a função `calculate`.
  const spy = jest.spyOn(utils, 'calculate').mockReturnValue(42);
  render(<MyComponent />);
  expect(spy).toHaveBeenCalled();
});
Enter fullscreen mode Exit fullscreen mode

Quando Usar

Use jest.spyOn quando você quiser espiar uma função específica em um módulo sem substituir todo o módulo. É especialmente útil quando você quer observar chamadas para métodos em instâncias de classes ou objetos específicos.

Comparação Direta

jest.mock

  • Escopo: Mocka módulos inteiros.
  • Substituição: Substitui todas as funções exportadas pelo módulo com versões mockadas.
  • Uso: Ideal para mockar bibliotecas de terceiros ou módulos locais inteiros.

jest.spyOn

  • Escopo: Espiona métodos específicos em objetos ou instâncias de classes.
  • Substituição: Cria uma versão mockada de uma função existente, permitindo observar chamadas e substituir o comportamento.
  • Uso: Ideal para observar e mockar métodos específicos em objetos ou instâncias, mantendo a implementação original disponível.

Exemplo Completo

Arquivo utils.js

export const calculate = (a, b) => a + b;
Enter fullscreen mode Exit fullscreen mode

Arquivo MyComponent.js

import React from 'react';
import { calculate } from './utils';

const MyComponent = () => {
  const result = calculate(2, 3);
  return <div>{result}</div>;
};

export default MyComponent;
Enter fullscreen mode Exit fullscreen mode

Teste com jest.mock

import React from 'react';
import { render, screen } from '@testing-library/react';
import MyComponent from './MyComponent';
import { calculate } from './utils';

jest.mock('./utils', () => ({
  calculate: jest.fn(),
}));

test('should call calculate function', () => {
  calculate.mockReturnValue(42);
  render(<MyComponent />);
  expect(calculate).toHaveBeenCalled();
  expect(screen.getByText('42')).toBeInTheDocument();
});
Enter fullscreen mode Exit fullscreen mode

Teste com jest.spyOn

import React from 'react';
import { render, screen } from '@testing-library/react';
import MyComponent from './MyComponent';
import * as utils from './utils';

test('should call calculate function', () => {
  const spy = jest.spyOn(utils, 'calculate').mockReturnValue(42);
  render(<MyComponent />);
  expect(spy).toHaveBeenCalled();
  expect(screen.getByText('42')).toBeInTheDocument();
});
Enter fullscreen mode Exit fullscreen mode

Conclusão

Tanto jest.mock quanto jest.spyOn são ferramentas poderosas no Jest para mockar funções e módulos. A escolha entre eles depende do contexto do teste e do que você está tentando alcançar. jest.mock é ótimo para substituir módulos inteiros, enquanto jest.spyOn é ideal para observar e mockar métodos específicos sem substituir todo o módulo.

Top comments (0)