Ola!
O mock não serve para testar a função em si, mas para testar o comportamento do código que depende dela. Quando você faz algo como jest.fn().mockReturnValue()
, não está avaliando se o mock funciona, e sim controlando o que uma dependência vai retornar para verificar se o seu código principal reage corretamente.
Pense assim: em um sistema real, uma função pode acessar banco de dados, serviços externos ou APIs. Em um teste unitário, você não quer depender desses recursos, porque isso tornaria o teste lento, frágil e difícil de reproduzir. Então, você substitui essa função real por um mock, que simula o comportamento esperado e permite isolar a lógica que está sendo testada.
Por exemplo, se você tem uma função criarUsuario
que chama servicoUsuario.salvar
, você quer testar se criarUsuario
chama o método corretamente e faz o que deveria com o retorno. O mock permite que você defina de forma controlada o retorno de salvar
, sem precisar acessar um banco de verdade. Assim:
function criarUsuario(servicoUsuario, nome) {
const usuario = servicoUsuario.salvar({ nome });
return usuario.id;
}
test('deve retornar o id do usuário salvo', () => {
const servicoMock = { salvar: jest.fn().mockReturnValue({ id: 1 }) };
const id = criarUsuario(servicoMock, 'João');
expect(id).toBe(1);
expect(servicoMock.salvar).toHaveBeenCalledWith({ nome: 'João' });
});
Nesse teste, o foco não é servicoMock.salvar
, e sim criarUsuario
. O mock só existe para que o comportamento de criarUsuario
possa ser verificado de forma previsível e isolada.
E, o jest.fn()
registra todas as chamadas e argumentos, o que uma função comum não faz. Por isso ele é mais do que apenas uma função simulada: ele também é uma ferramenta de observação.
Abç;