能否在Jest配置中为特定测试文件单独启用setupFilesAfterEnv?
问题描述
我正在为Prisma实现单元测试与集成测试,计划用*.service.test.ts文件执行单元测试,*.test.ts文件执行集成测试。按照Prisma文档操作后遇到问题:开启setupFilesAfterEnv选项时,*.test.ts的集成测试无法正常运行,关闭该选项则可正常执行。我希望仅在单元测试中启用setupFilesAfterEnv选项,请问能否在Jest配置中为特定测试文件单独应用该配置?
相关代码
singleton.ts
import { mockReset, mockDeep, DeepMockProxy } from "jest-mock-extended"; import { PrismaClient } from "@prisma/client"; import Prisma from "../src/db/prisma"; jest.mock("../src/db/prisma", () => { return { __esModule: true, default: mockDeep<PrismaClient>(), }; }); beforeEach(() => { // eslint-disable-next-line no-use-before-define mockReset(prismaMock); }); export const prismaMock = Prisma as unknown as DeepMockProxy<PrismaClient>;
jest.config.ts(相关配置片段)
... setupFilesAfterEnv: [ "./jest/singleton.ts" ]
解决方案
可以通过Jest的多配置项实现需求,在jest.config.ts中导出配置数组,分别为单元测试和集成测试定义独立规则:
- 拆分配置逻辑
提取通用配置避免重复,为单元测试保留setupFilesAfterEnv,集成测试不启用该选项:
// 通用配置,减少重复代码 const commonConfig = { moduleFileExtensions: ["ts", "js"], transform: { "^.+\\.ts$": "ts-jest", }, // 其他全局通用配置项 }; export default [ // 单元测试专属配置 { ...commonConfig, displayName: "unit", testMatch: ["**/*.service.test.ts"], setupFilesAfterEnv: ["./jest/singleton.ts"], }, // 集成测试专属配置 { ...commonConfig, displayName: "integration", testMatch: ["**/*.test.ts"], exclude: ["**/*.service.test.ts"], // 此处不设置setupFilesAfterEnv,避免干扰集成测试 }, ];
- 运行测试的方式
- 单独执行单元测试:
jest --displayName unit - 单独执行集成测试:
jest --displayName integration - 执行所有测试:
jest
另外也可以通过测试文件顶部的注释指令临时覆盖全局配置,但这种方式不如多配置直观易维护。比如在集成测试文件开头添加:
/* jest setupFilesAfterEnv=[] */
不过需要确保Jest的commentInitialization选项处于启用状态(默认开启),优先推荐使用多配置方案。
内容的提问来源于stack exchange,提问作者DoHan_Kim
相关产品推荐
相关产品推荐

