Uncaught TypeError: 无法读取undefined的push属性,求排查测试代码问题
问题排查:Uncaught TypeError: Cannot read properties of undefined (reading 'push')
核心原因分析
这个错误几乎都是HTTP测试依赖未正确初始化导致的,结合你的代码,重点排查以下几个点:
具体修复步骤
必须导入
HttpClientTestingModule
Angular测试环境不会自动提供HttpClient的模拟实现,必须在TestBed配置中导入HttpClientTestingModule,否则HttpClient实例为undefined,调用get方法时内部请求队列的push操作会直接抛出错误。补全后的测试初始化代码应该是这样:
import { TestBed } from '@angular/core/testing'; import { HttpClientTestingModule, HttpTestingController } from '@angular/common/http/testing'; import { YourService } from './your-service-path'; // 替换为你的服务实际路径 import { environment } from '../environments/environment'; describe('YourService', () => { let service: YourService; let httpMock: HttpTestingController; beforeEach(() => { TestBed.configureTestingModule({ imports: [HttpClientTestingModule], // 关键:导入这个模块 providers: [YourService] }); // 正确注入服务和测试控制器 service = TestBed.inject(YourService); httpMock = TestBed.inject(HttpTestingController); }); afterEach(() => { httpMock.verify(); // 验证所有请求都已处理,避免泄漏 }); it('#getTimeSessionLogout', () => { // 提前定义预期响应,避免未定义错误 const response = { /* 这里填你的预期响应数据 */ }; service.getTimeSessionLogout().subscribe(data => { expect(data).toEqual(response); }); const request = httpMock.expectOne(`${environment.apiMaster}/config-system/time_session`); expect(request.request.method).toBe('GET'); request.flush(response); }); });检查服务和测试控制器的注入
确保你通过TestBed.inject()正确获取了service和httpMock实例,不要直接声明变量却不赋值,否则会引发后续调用的未定义错误。确认服务已在测试模块中注册
必须在TestBed.configureTestingModule的providers数组里添加你的服务类,否则service实例会是undefined,调用getTimeSessionLogout时也会触发连锁错误。
额外细节修正
- 测试用例里的
response变量需要提前定义,否则会报response is not defined的错误(你的代码中未看到该变量的定义,这也是潜在问题)。
内容的提问来源于stack exchange,提问作者Jaug
相关产品推荐
相关产品推荐

