Angular 14项目中Jest命令行测试与VSCode Orta Jest插件配置冲突的解决求助
我现在陷入了Angular 14项目的Jest配置悖论,求各位大佬帮忙!
我在VSCode里用Orta的Jest插件跑测试,同时也需要保证命令行执行npm run test时测试也能正常通过。但现在的问题是,调通其中一个,另一个就会出问题——单独用任意一种方式时所有测试都能过,说明测试用例本身是没问题的。
先说说当前命令行能正常跑的配置:
- 我的
setup-jest.ts里只有一行代码:
import './jest-global-mocks';
jest.config.ts的配置如下:
const { pathsToModuleNameMapper } = require('ts-jest'); const { paths } = require('./tsconfig.json').compilerOptions; module.exports = { preset: 'jest-preset-angular', roots: ['<rootDir>/src'], setupFilesAfterEnv: ['<rootDir>/src/setup-jest.ts'], testMatch: ['<rootDir>/src/**/*.spec.ts', '<rootDir>/src/**/*.mjs'], testPathIgnorePatterns: ['/node_modules/', 'dist'], testEnvironment: 'jsdom', moduleNameMapper: pathsToModuleNameMapper(paths, { prefix: '<rootDir>' }), globalSetup: 'jest-preset-angular/global-setup', collectCoverage: true, collectCoverageFrom: [ 'src/app/**/*.ts', '!**/index.ts', '!**/*.mock.ts', '!**/*.module.ts', '!**/routes.ts', '!**/*.routes.ts' ], // 其他省略配置... };
这个配置下,npm run test能全部通过,一片绿。
但用VSCode的Jest插件跑测试时,就会出现一堆错误:
"zone-testing.js is needed for the fakeAsync() test helper but could not be found. Please make sure that your environment includes zone.js/testing"
于是我把zone.js/testing加到setup-jest.ts开头,结果又报错说Zone未定义,接着我又加了zone.js的导入,此时setup-jest.ts变成这样:
import 'zone.js'; import 'zone.js/testing'; import './jest-global-mocks';
但插件跑测试又出现新错误:
'TypeError: Cannot read properties of null (reading 'ngModule')'
'Need to call TestBed.initTestEnvironment() first'
没办法,我继续在setup-jest.ts里加了TestBed初始化的代码,最终文件内容是:
import 'zone.js'; import 'zone.js/testing'; import './jest-global-mocks'; import { TestBed } from "@angular/core/testing"; import { BrowserDynamicTestingModule, platformBrowserDynamicTesting } from "@angular/platform-browser-dynamic/testing"; TestBed.initTestEnvironment(BrowserDynamicTestingModule, platformBrowserDynamicTesting());
这下插件跑测试全部通过了!
但问题来了:此时再用命令行执行npm run test,所有测试都抛出同一个错误:
cannot set base providers because it has already been called
import { BrowserDynamicTestingModule, platformBrowserDynamicTesting } from "@angular/platform-browser-dynamic/testing"; TestBed.initTestEnvironment(BrowserDynamicTestingModule, platformBrowserDynamicTesting());
我知道这是因为加了TestBed初始化代码导致的,但实在不知道怎么才能让两种方式都正常工作?有没有大佬给个思路,万分感谢!
另外我还试过把jest.config.ts里的setupFilesAfterEnv: ['<rootDir>/src/setup-jest.ts']去掉,这样命令行没问题了,但插件又跑不起来了。
备注:内容来源于stack exchange,提问作者Bazidoa

