Jest未加载手动Mock文件,目录结构无误,问题出在哪?
解决Jest手动Mock未生效的问题
我仔细看了你的代码和目录结构,问题主要出在Mock文件的写法不符合class导出的场景,另外还有一个小细节需要调整,下面一步步说:
1. 修正Mock文件的写法
你的源文件Foo.js导出的是一个class,而你当前的Mock是直接给jest.genMockFromModule返回的对象添加doStuff方法——这只会修改构造函数本身的属性,不会影响通过new Foo()创建的实例的方法(实例的方法来自class的原型)。
你可以选择两种正确的Mock写法:
写法一:直接模拟class
// src/adapters/__mocks__/Foo.js class MockFoo { doStuff() { return { source: 'mock' }; } } module.exports = MockFoo;
写法二:基于jest.genMockFromModule修改原型方法
如果你想保留jest.genMockFromModule的自动Mock能力,需要修改class原型上的方法:
// src/adapters/__mocks__/Foo.js const Foo = jest.genMockFromModule('../Foo'); // 修改原型上的doStuff,这样实例调用时会使用Mock方法 Foo.prototype.doStuff = function() { return { source: 'mock' }; }; module.exports = Foo;
2. 在测试文件中显式触发Mock
虽然Jest默认会自动识别__mocks__目录下的文件,但为了确保Mock生效,建议在测试文件开头显式调用jest.mock('../Foo'),告诉Jest加载你的手动Mock:
// src/adapters/__tests__/Foo.js const Foo = require('../Foo'); // 显式启用Mock jest.mock('../Foo'); test('Foo', () => { const foo = new Foo(); expect(foo.doStuff()).toEqual({ source: 'mock' }); });
额外检查(可选)
如果还是没生效,可以确认你的Jest配置中,moduleDirectories包含了src目录,确保Jest能正确找到模块和对应的Mock文件。
内容的提问来源于stack exchange,提问作者AfterWorkGuinness
相关产品推荐
相关产品推荐

