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

Angular执行ng test时因environment.ts中window.env未定义报错

Angular测试时window.env未定义的解决方法

问题背景

项目通过environment.ts从Kubernetes YAML读取环境配置,代码如下:

export const environment = {
  PROD_URL: window["env"].prodUrl || 'http://localhost:8080/v1/'
};

执行ng test命令时触发以下错误:

An error was thrown in afterAll
Uncaught TypeError: Cannot read property 'prodUrl' of undefined
TypeError: Cannot read property 'prodUrl' of undefined
at Module.AytR (http://localhost:9876/karma_webpack/webpack:/src/environments/environment.ts:9:30)

解决办法

方法1:给Karma添加测试环境初始化脚本

修改karma.conf.js配置,在测试加载前注入window.env的默认值:

// karma.conf.js
module.exports = function(config) {
  config.set({
    // ...其他原有配置
    files: [
      // 新增初始化脚本,放在其他文件前面
      'src/test-env-setup.js',
      // ...原有文件列表
    ]
  });
};

然后在src目录下创建test-env-setup.js:

window.env = {
  prodUrl: 'http://localhost:8080/v1/'
};

方法2:修改environment.ts的取值逻辑

直接在环境文件里增加空值校验,避免访问未定义的window.env:

// TS 3.7+支持的可选链写法
export const environment = {
  PROD_URL: window["env"]?.prodUrl || 'http://localhost:8080/v1/'
};

// 兼容老版本TS的写法
export const environment = {
  PROD_URL: (window["env"] && window["env"].prodUrl) || 'http://localhost:8080/v1/'
};

方法3:在测试入口文件全局初始化

在Angular默认的测试入口src/test.ts开头添加初始化代码(需放在其他import之前):

// src/test.ts
(window as any).env = {
  prodUrl: 'http://localhost:8080/v1/'
};

// ...原有测试入口代码
import 'zone.js/testing';
import { getTestBed } from '@angular/core/testing';
// ...

内容的提问来源于stack exchange,提问作者santosh gore

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 10:45:39