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

Angular 14项目中Jest命令行测试与VSCode Orta Jest插件配置冲突的解决求助

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.23 12:14:08