如何在Jest中mock模块内部返回对象的函数调用 解决类型报错问题
解决步骤
核心问题说明
jest.mock()的返回值是jest全局对象本身,并非你在工厂函数中定义的mock实例,直接将其作为mockReturnValue的入参会触发类型不匹配错误。toThrowError()断言要求入参为待执行的函数引用,直接执行目标函数会导致错误直接抛出、终止测试,无法命中断言。- 你已经通过
spyOnmock了food方法的返回值,调用taste时不会触发真实的new Fruit()逻辑,因此原代码中全局mockfruit模块的代码属于冗余内容,可以直接删除。
修正后的测试代码
你改写的Sample.ts自导入逻辑不需要调整,仅修改测试代码即可:
test('taste 方法在getTaste抛错时同步抛出错误', () => { const sample = require('./sample'); // 构造符合预期的mock Fruit实例,仅需实现用例中用到的方法 const mockFruitInstance = { getTaste: jest.fn(() => { throw new Error("Test Error"); }) }; // 替换food方法的返回值为mock实例 jest.spyOn(sample, 'food').mockReturnValue(mockFruitInstance); // 传入函数引用给expect,由jest执行并捕获抛出的错误 expect(() => sample.taste()).toThrowError("Test Error"); })
可选方案:全局mock Fruit类
如果你的其他测试用例需要统一mock Fruit模块,可使用如下写法,此时不需要单独mockfood方法:
// 放在测试文件顶部,jest会自动提升该代码到所有import之前执行 jest.mock("./fruit", () => ({ // 若Fruit为命名导出则替换为对应导出名 default: jest.fn().mockImplementation(() => ({ getTaste: jest.fn(() => { throw new Error("Test Error"); }), promise: jest.fn() })) })); test('taste 方法在getTaste抛错时同步抛出错误', () => { const sample = require('./sample'); expect(() => sample.taste()).toThrowError("Test Error"); })
内容的提问来源于stack exchange,提问作者nfornicole
相关产品推荐
相关产品推荐

