Jest 模拟节点模块不适用于打字稿

Put*_*txe 4 unit-testing mocking typescript jestjs ts-jest

我尝试模拟uuid/v4来自 npm的模块。为此,我按照 jest 的建议创建了一个模拟文件夹:https : //jestjs.io/docs/en/manual-mocks

我的文件夹结构:

???__mocks__ 
|  ???uuid
|       ???v4.ts
???src
?   ???__tests__
?   ??? ...
???node_modules
Run Code Online (Sandbox Code Playgroud)

模拟节点模块文件v4.ts

module.exports = jest.fn();
Run Code Online (Sandbox Code Playgroud)

当我尝试在我的测试文件中导入 uuid/v4 时,jest 通常应该导入模拟并且我应该能够使用它。

这是我的测试文件:

import uuidv4 from 'uuid/v4';

it('should create a job', () => {
    const jobId = 'fake-job-id';
    uuidv4.mockReturnValue(jobId); 
    ...
}
Run Code Online (Sandbox Code Playgroud)

不幸的是,模拟导入似乎不起作用,因为我无法添加mockReturnValuejest 提供的内容,并且出现以下打字稿错误: property 'mockReturnValue' does not exist on type v4. ts(2339)

你知道我该如何解决吗?提前致谢。

Bri*_*ams 6

处理这种情况的一种常用方法是在测试中自动模拟模块,然后通过使用以下命令告诉 TypeScript 模块是自动模拟的jest.Mocked

jest.mock('uuid/v4');  // <= auto-mock uuid/v4

import uuidv4 from 'uuid/v4';
const mocked = uuidv4 as jest.Mocked<typeof uuidv4>;  // <= tell TypeScript it's an auto-mock

test('hi', () => {
  mocked.mockReturnValue('mocked result');  // <= use the properly typed mock
  expect(uuidv4()).toBe('mocked result');  // Success!
})
Run Code Online (Sandbox Code Playgroud)

不幸的是,输入 foruuid/v4似乎不适用于这种方法。

作为解决方法,您可以使用类型断言:

jest.mock('uuid/v4');  // <= auto-mock uuid/v4

import uuidv4 from 'uuid/v4';

test('hi', () => {
  (uuidv4 as jest.Mock).mockReturnValue('mocked result');  // <= use a type assertion
  expect(uuidv4()).toBe('mocked result');  // Success!
})
Run Code Online (Sandbox Code Playgroud)