在 Jest 中,我如何嘲笑无效的 Promise?

Dav*_*ave 16 mocking void promise typescript ts-jest

我正在使用 Jest 和 Typescript。我有一个不返回任何内容的异步函数(void)。我如何模拟返回 void?我尝试了下面的

const myMockFn = jest.fn().mockImplementationOnce(() => Promise.resolve(void));
jest.mock('../config', () => ({
  setup: async () =>
  myMockFn(),
}));
Run Code Online (Sandbox Code Playgroud)

但我收到编译错误

Expression expected.
Run Code Online (Sandbox Code Playgroud)

与“Promise.resolve(void)”相关。

ale*_*xor 30

void这里使用的value位置是javascript运算符。它是一个一元运算符,即它接受单个参数。因此出现错误。

void作为打字稿类型,应该在type位置上使用来表示函数返回值不会被观察到。

const myMockFn = jest.fn().mockImplementationOnce(() => Promise.resolve());
Run Code Online (Sandbox Code Playgroud)

这足以模拟具有返回类型的函数Promise<void>


Han*_*ood 8

您可以模拟一个返回的函数Promise<void>

jest.fn().mockResolvedValue(undefined)
Run Code Online (Sandbox Code Playgroud)

如果您尝试捕获void函数的返回值,您会得到undefined

function foo(): void {
  console.log('foo called');
}

console.log(foo());

// foo called
// undefined
Run Code Online (Sandbox Code Playgroud)

此外,Promise<void>似乎与Promise<undefined>

console.log(Promise.resolve());
// Promise { undefined }

console.log(Promise.resolve(undefined));
// Promise { undefined }
Run Code Online (Sandbox Code Playgroud)

undefined兼容并且void可以是解析值:

interface Bar {
  foo(): Promise<void>;
}

describe('StackOverflow', () => {
  test('mock Promise<void>', async () => {
    const mockBar: Bar = {
      foo: jest.fn().mockResolvedValueOnce(undefined),
    };
    await mockBar.foo();
  });
});
Run Code Online (Sandbox Code Playgroud)