typescript - Jest 模拟节点模块不适用于 typescript

标签 typescript unit-testing mocking jestjs ts-jest

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

我的文件夹结构:

├──__mocks__ 
|  └──uuid
|       └──v4.ts
├──src
│   └──__tests__
│   └── ...
├──node_modules

模拟节点模块文件 v4.ts :
module.exports = jest.fn();

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

这是我的测试文件:
import uuidv4 from 'uuid/v4';

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

不幸的是,模拟导入似乎不起作用,因为我无法添加 mockReturnValue由 jest 提供,我有以下 typescript 错误:property 'mockReturnValue' does not exist on type v4. ts(2339)
你知道我该如何解决吗?提前谢谢。

最佳答案

处理这种情况的常用方法是在测试中自动模拟模块,然后使用 jest.Mocked 告诉 TypeScript 模块是自动模拟的。像这样:

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!
})

不幸的是 uuid/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!
})

关于typescript - Jest 模拟节点模块不适用于 typescript ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57788291/

相关文章:

javascript - RxJs 从 Promise 扩展数组

javascript - 如何将成员的所有函数公开为类自己的函数?

typescript - 我如何监视 Typescript 的 getter 和 setter?

typescript - TypeScript 中的双等号 (==)

c# - DotNetOpenAuth:模拟 ClaimsResponse

python - 如何模拟在不同模块的导入方法中导入的函数

typescript ,单元测试 : Correct typing for Dispatching a Thunk with store. 从 redux-mock-store 发送

python 测试覆盖率与之前运行的比较

node.js - 我怎样才能在单元测试中每次都获得新的电子邮件和电话号码?

c# - RhinoMocks 期望复杂对象作为参数