typescript - No Jest, como faço para mockar uma Promise de void?
Estou usando Jest e Typescript. Tenho uma função assíncrona que não retorna nada (void). Como faço para simular o retorno de void? Eu tentei o seguinte
const myMockFn = jest.fn().mockImplementationOnce(() => Promise.resolve(void));
jest.mock('../config', () => ({
setup: async () =>
myMockFn(),
}));
mas eu recebo o erro de compilação
Expression expected.
relacionado a "Promise.resolve(void)".
Resposta #1
void usado aqui na posição de value é um operador do JavaScript. É um operador unário, ou seja, aceita um único argumento. Assim, o erro.
O void como um tipo do TypeScript deve ser usado na posição de type para expressar que o valor de retorno da função não será observado.
const myMockFn = jest.fn().mockImplementationOnce(() => Promise.resolve());
Isso é suficiente para simular uma função com tipo de retorno Promise<void>.
Resposta #2
Você pode simular uma função que retorna Promise<void> com:
jest.fn().mockResolvedValue(undefined)
Se você tentar capturar o valor de retorno de uma função void, você obterá undefined:
function foo(): void {
console.log('foo called');
}
console.log(foo());
// foo called
// undefined
Além disso, Promise<void> parece ser o mesmo que Promise<undefined>:
console.log(Promise.resolve());
// Promise { undefined }
console.log(Promise.resolve(undefined));
// Promise { undefined }
undefined é compatível com void e pode ser o valor resolvido:
interface Bar {
foo(): Promise<void>;
}
describe('StackOverflow', () => {
test('mock Promise<void>', async () => {
const mockBar: Bar = {
foo: jest.fn().mockResolvedValueOnce(undefined),
};
await mockBar.foo();
});
});
