如何在Jest测试中Mock其他文件的导入修改依赖常量值?
在Jest中Mock导入的常量值测试函数
先修正下原代码里的路径问题:func/b.ts中导入isOn的路径写错了,应该从../const/a.ts导入,而不是../func/a.ts,否则会找不到模块。
要MockisOn的值为true来测试isMachineOn(),有两种常用实现方式:
方法一:直接Mock整个模块
这种方法适合所有测试用例都需要固定Mock值的场景:
// __test__/b.test.ts import { isMachineOn } from '../func/b'; import { isOn } from '../const/a'; // Mock const/a模块,强制将isOn设为true jest.mock('../const/a', () => ({ isOn: true })); test('isMachineOn 应返回true(Mock后的isOn值)', () => { expect(isMachineOn()).toBe(true); });
方法二:动态Mock(支持不同用例修改值)
如果需要在不同测试用例中切换isOn的Mock值,可以用jest.spyOn结合getter Mock:
// __test__/b.test.ts import { isMachineOn } from '../func/b'; import * as aModule from '../const/a'; // 每个测试前清空Mock,避免用例间干扰 beforeEach(() => { jest.clearAllMocks(); }); test('isMachineOn 在isOn被Mock为true时返回true', () => { // 因为isOn是常量,需要指定'get'参数来Mock其getter const isOnSpy = jest.spyOn(aModule, 'isOn', 'get').mockReturnValue(true); expect(isMachineOn()).toBe(true); isOnSpy.mockRestore(); // 测试结束后恢复原常量值 }); test('isMachineOn 使用原常量值时返回false', () => { expect(isMachineOn()).toBe(false); });
内容的提问来源于stack exchange,提问作者Davi Caamano
相关产品推荐
相关产品推荐

