Jest模拟Node.js类中异步函数失效问题求助
解决Jest中类异步方法模拟未生效的问题
以下是几个常见问题点及对应的解决办法:
1. 变量名大小写错误
你的模拟代码中写的是Myclass.prototype.fetchData,但原类名称是MyClass(首字母C为大写),大小写不匹配会导致模拟无法挂载到正确的原型上,自然不会生效。
修正后的模拟代码:
MyClass.prototype.fetchData = jest.fn().mockResolvedValue(['MOCKED_RESULT']);
2. 实例化顺序错误
如果在模拟原型方法之前就创建了MyClass的实例,该实例的fetchData方法会保留原类的实现,后续修改原型不会影响已存在的实例。
正确顺序是先模拟原型方法,再创建实例:
const MyClass = require('./Index'); // 第一步:模拟原型方法 MyClass.prototype.fetchData = jest.fn().mockResolvedValue(['PROCESSED_DATA']); // 第二步:创建实例 const myInstance = new MyClass(); // 第三步:执行测试 test('fetchData 模拟生效', async () => { const result = await myInstance.fetchData(); expect(result).toEqual(['PROCESSED_DATA']); expect(MyClass.prototype.fetchData).toHaveBeenCalled(); });
3. 模块导入与模拟时机问题
如果测试文件中先导入并实例化MyClass,再进行模拟操作,同样会导致模拟失效。必须确保模拟逻辑在模块导入(或实例化)之前执行。
若使用ES模块的import语法,建议用jest.mock直接模拟整个模块:
// 先模拟模块 jest.mock('./Index', () => { return jest.fn().mockImplementation(() => ({ fetchData: jest.fn().mockResolvedValue(['MOCKED_DATA']) })); }); // 再导入模块 import MyClass from './Index'; test('模块级模拟生效', async () => { const instance = new MyClass(); const result = await instance.fetchData(); expect(result).toEqual(['MOCKED_DATA']); });
4. 异步方法模拟规范
因为fetchData是异步函数,建议用mockResolvedValue替代mockReturnValue,返回一个resolved状态的Promise,更符合异步函数的返回类型,避免后续处理出现异常。
内容的提问来源于stack exchange,提问作者VIKAS PAL
相关产品推荐
相关产品推荐

