Mock Functions
Funções Mock, ou de simulação, também são conhecidos como "espiões", porque elas permitem você espionar o comportamento de uma função que é chamada indiretamente por algum outro código, ao invés de apenas testando a saída. Você pode criar uma função de simulação (mock, em inglês) com jest.fn()
. Se nenhuma implementação é dada, a função de simulação retornará undefined
quando invocada.
Métodos #
Referência #
mockFn.mock.calls
#
Uma array que representa todas as chamadas que foram feitas para esta função simulada (mock, em inglês). Cada chamada é representada por um array de argumentos que foram passados durante a chamada.
Por exemplo: uma função simulada f
que tem sido chamado duas vezes, com os argumentos f('arg1', 'arg2')
, e em seguida com os argumentos f('arg3', 'arg4')
teria um array de mock.calls
que se parece com isto:
[ ['arg1', 'arg2'], ['arg3', 'arg4'], ];
mockFn.mock.instances
#
Um array que contém todas as instâncias de objeto que tem sido instanciados a partir desta função simulada (mock, em inglês) usando new
.
Por exemplo: uma função de simulação que foi instanciada duas vezes teria o seguinte array de mock.instances
:
const mockFn = jest.fn(); const a = new mockFn(); const b = new mockFn(); mockFn.mock.instances[0] === a; // true mockFn.mock.instances[1] === b; // true
mockFn.mockClear()
#
Redefine todas as informações armazenadas nos arrays de mockFn.mock.calls
e mockFn.mock.instances
.
Muitas vezes isto é útil quando você deseja limpar os dados de uso de uma simulação entre duas afirmações.
Cuidado que mockClear
irá substituir mockFn.mock
, não apenas mockFn.mock.calls
e mockFn.mock.instances
. Portanto, evite atribuir mockFn.mock
a outras variáveis, temporárias ou não, para certificar-se de que não vai acessar dados obsoletos.
A opção de configuração clearMocks
está disponível para limpar as simulações automaticamente entre os testes.
mockFn.mockReset()
#
Redefine todas as informações armazenadas na simulação (mock, em inglês), incluindo qualquer implementação inicial dada.
Isso é útil quando você deseja restaurar completamente uma simulação (mock, em inglês) de volta ao seu estado inicial.
Cuidado que mockClear
irá substituir mockFn.mock
, não apenas mockFn.mock.calls
e mockFn.mock.instances
. Portanto, evite atribuir mockFn.mock
a outras variáveis, temporárias ou não, para certificar-se de que não vai acessar dados obsoletos.
mockFn.mockRestore()
#
Remove a simulação (mock, em inglês) e restaura a implementação inicial.
Isso é útil quando você quer simular funções em certos casos de teste e restaurar a implementação original em outros.
Cuidado que mockFn.mockRestore
só funciona quando a simulação foi criada com jest.spyOn
. Assim, tem que cuidar da restauração você mesmo quando atribuir manualmente jest.fn()
.
mockFn.mockImplementation(fn)
#
Aceita uma função que deve ser usada como a implementação da simulação (mock, em inglês). A simulação em si ainda irá gravar todas as chamadas que entram e instâncias que vêm dela própria – a única diferença é que a implementação também será executada quando a simulação é chamada.
Nota: jest.fn(implementation)
é uma forma abreviada para jest.fn().mockImplementation(implementation)
.
Por exemplo:
const mockFn = jest.fn().mockImplementation(scalar => 42 + scalar); // or: jest.fn(scalar => 42 + scalar); const a = mockFn(0); const b = mockFn(1); a === 42; // true b === 43; // true mockFn.mock.calls[0][0] === 0; // true mockFn.mock.calls[1][0] === 1; // true
mockImplementation
também pode ser usado para simular (mock, em inglês) construtores de classe:
// SomeClass.js module.exports = class SomeClass { m(a, b) {} } // OtherModule.test.js jest.mock('./SomeClass'); // this happens automatically with automocking const SomeClass = require('./SomeClass') const mMock = jest.fn() SomeClass.mockImplementation(() => { return { m: mMock } }) const some = new SomeClass() some.m('a', 'b') console.log('Calls to m: ', mMock.mock.calls)
mockFn.mockImplementationOnce(fn)
#
Aceita uma função que será usada como uma implementação de simulação para uma chamada à função simulada (mocked, em inglês). Podem ser encadeadas para que várias chamadas de função produzam resultados diferentes.
var myMockFn = jest.fn() .mockImplementationOnce(cb => cb(null, true)) .mockImplementationOnce(cb => cb(null, false)); myMockFn((err, val) => console.log(val)); > true myMockFn((err, val) => console.log(val)); > false
Quando a função simulada fica sem implementações definidas com mockImplementationOnce, ela irá executar o conjunto padrão de implementação com jest.fn(() => defaultValue)
ou .mockImplementation(() => defaultValue)
se eles foram chamados:
var myMockFn = jest.fn(() => 'default') .mockImplementationOnce(() => 'first call') .mockImplementationOnce(() => 'second call'); console.log(myMockFn(), myMockFn(), myMockFn(), myMockFn()); > 'first call', 'second call', 'default', 'default'
mockFn.mockReturnThis()
#
Apenas uma função simplificada para:
jest.fn(function() { return this; });
mockFn.mockReturnValue(value)
#
Aceita um valor que será retornado sempre que a função de simulação é chamada.
const mock = jest.fn(); mock.mockReturnValue(42); mock(); // 42 mock.mockReturnValue(43); mock(); // 43
mockFn.mockReturnValueOnce(value)
#
Aceita um valor que será retornado por uma chamada para a função de simulação. Podem ser encadeados para que sucessivas chamadas para a função de simulação retornem valores diferentes. Quando não há mais valores mockReturnValueOnce
para usar, chamadas irão retornar um valor especificado pelo mockReturnValue
.
const myMockFn = jest.fn() .mockReturnValue('default') .mockReturnValueOnce('first call') .mockReturnValueOnce('second call'); console.log(myMockFn(), myMockFn(), myMockFn(), myMockFn()); > 'first call', 'second call', 'default', 'default'