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();
});
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();
});
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;
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;
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();
});
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();
});
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)