Pesquisa de site

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

Artigos relacionados