【问题标题】:Mocking Function with jest.mock in jest在 jest 中使用 jest.mock 模拟函数
【发布时间】:2021-08-27 15:24:27
【问题描述】:

我在我的测试中模拟了一个函数

jest.mock('@lib/commons', () => ({
    callApi: () => Promise.resolve({id: 'value'}),
    validateSchema: () => true
}));

如果我这样使用它就完美了

jest.mock('@lib/commons', () => ({
  callApi: () => Promise.resolve({id: 'value'}),
  validateSchema: () => true
}));

it("test", async () => {
  // Test code
});

但问题是我不能将 jest.mock 放入 it。鉴于我希望根据不同的场景获得不同的结果,我希望它可以作为一个函数工作。有什么建议吗?

【问题讨论】:

  • 当你在测试中模拟时它没有被提升,当你正在测试的模块被导入时模拟不存在。您还必须将该模块的导入移动到测试中,请参阅jestjs.io/docs/jest-object 中的示例。但请注意,您实际上并不需要这样做才能在不同的测试中获得不同的响应 - 将模拟导入您的测试文件并使用它们公开的配置方法。

标签: typescript jestjs ts-jest


【解决方案1】:

在您的模拟中,您可以使用jest.fn() 创建模拟函数。然后,您可以使用这些函数来模拟每次测试所需的结果。

import * as C from '@lib/commons';

jest.mock('@lib/commons', () => ({
    callApi: jest.fn(),
    validateSchema: jest.fn()
}));

const callApi = C.callApi as jest.Mock;
const validateSchema = C.validateSchema as jest.Mock

it('test', async () => {
  callApi.mockResolvedValue({ id: 'otherValue' })
  validateSchema.mockReturnValue(false)
  // your actual test here
})

我相信tsjest 有一个mocked 助手可以使这更容易一些,但我自己没有使用过。

【讨论】:

  • 不工作。这给了我错误callApi.mockResolvedValue is not a function
  • 可能与您使用的库导出其方法的方式有关。该方法通常有效,因为我在我的项目中经常使用它。尝试不同的导入方式。如果这里没有其他人为您提供解决方案,恐怕您将不得不使用一些搜索引擎并阅读一些博客。开玩笑的文档似乎没有涵盖它。
猜你喜欢
  • 2019-07-22
  • 1970-01-01
  • 2023-03-26
  • 1970-01-01
  • 1970-01-01
  • 2018-09-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多