You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.18 12:12:37