如何在Jest+TypeScript中通过__mocks__文件夹复用Mock
解决Jest手动__mocks__文件夹Mock不生效的问题
问题核心
你当前在__mocks__文件夹里的写法有误——手动Mock文件不需要包裹jest.mock()调用,这个文件本身就是用来替代原模块的实现,而非在内部触发mock逻辑。
正确的手动Mock配置步骤
1. 修正__mocks__文件夹的Mock文件
修改__mocks__/books/book-search-service.ts,直接导出Mock类的实现,去掉内部的jest.mock:
// __mocks__/books/book-search-service.ts export const findBooksMock = jest.fn(); export const createBookSearchRequestMock = jest.fn(); export class BookSearchService { findBooks = findBooksMock; createBookSearchRequest = createBookSearchRequestMock; }
注意:Mock文件的路径要和原模块严格对应——原模块在
src/books/book-search-service.ts,所以__mocks__要放在和src同级的目录下,结构为__mocks__/books/book-search-service.ts,保证Jest能匹配到对应路径的Mock。
2. 在测试文件中启用手动Mock
在测试文件开头调用jest.mock指定要Mock的模块路径,Jest会自动匹配对应的__mocks__文件:
// 测试文件示例:src/books/__tests__/book-service.test.ts import { BookSearchService } from '../book-search-service'; // 导入Mock文件里的函数,方便在测试中控制返回值 import { findBooksMock, createBookSearchRequestMock } from '../../../__mocks__/books/book-search-service'; // 启用手动Mock,路径要和导入原模块的路径一致 jest.mock('../book-search-service'); describe('books service suite', () => { beforeEach(() => { // 每次测试前重置Mock调用记录 jest.clearAllMocks(); }); it('should call findBooks with correct params', async () => { // 预设Mock返回值 findBooksMock.mockResolvedValue([{ id: 1, title: 'Test Book' }]); const service = new BookSearchService(); const result = await service.findBooks('test query'); // 验证调用和返回值 expect(findBooksMock).toHaveBeenCalledWith('test query'); expect(result).toEqual([{ id: 1, title: 'Test Book' }]); }); });
3. 项目目录结构参考
确保你的目录结构符合Jest的手动Mock规则:
your-project/ ├── src/ │ └── books/ │ ├── book-search-service.ts │ └── __tests__/ │ └── book-service.test.ts └── __mocks__/ └── books/ └── book-search-service.ts
关键注意事项
- 路径匹配:
__mocks__文件夹的子路径必须和原模块在src下的路径完全一致,Jest通过路径匹配定位对应Mock。 - 避免重复jest.mock:不要在Mock文件里写
jest.mock,手动Mock文件本身就是原模块的替代实现。 - Mock函数复用:把Mock函数导出后,可在多个测试文件中导入并控制它们的行为,实现复用需求。
内容的提问来源于stack exchange,提问作者BreenDeen
相关产品推荐
相关产品推荐

