如何解决NullInjectorError: No provider for AppContextService错误?
解决Angular NullInjectorError: No provider for AppContextService! 的问题
问题根源
你的代码存在两个关键冲突点:
MyService同时通过@Injectable({providedIn: 'root'})(根注入器)和模块的providers数组注册,导致注入器逻辑混乱。- 错误栈中的
DynamicTestModule说明这是单元测试场景,测试环境不会自动继承应用模块的提供者配置,必须手动声明依赖。
具体解决步骤
1. 清理重复注册的服务
providedIn: 'root'已经将MyService标记为根级单例服务,无需再在my-service.module.ts的providers中重复注册。修改模块代码:
// my-service.module.ts providers: [ AppContextService // 仅保留AppContextService(如果它未使用providedIn: 'root') ]
如果AppContextService也应该是全局可用的,直接给它添加根级注入配置,彻底摆脱模块注册:
// app-context.service.ts import { Injectable } from '@angular/core'; @Injectable({ providedIn: 'root' }) export class AppContextService { // ...你的服务逻辑 }
此时AppContextService也不需要在任何模块的providers中注册。
2. 配置测试模块的提供者
因为错误出现在测试环境,必须在测试文件的TestBed中显式声明所有依赖的服务:
// my.service.spec.ts import { TestBed } from '@angular/core/testing'; import { MyService } from './my.service'; import { AppContextService } from './app-context.service'; import { HttpService } from './http.service'; describe('MyService', () => { let service: MyService; beforeEach(() => { TestBed.configureTestingModule({ providers: [ MyService, AppContextService, // 必须添加这个提供者 HttpService // 若HttpService需要Mock,可替换为自定义Mock类 ] }); service = TestBed.inject(MyService); }); it('should be created', () => { expect(service).toBeTruthy(); }); });
如果不想使用真实服务,也可以用Mock类替代,比如:
// 定义Mock类 class MockAppContextService { // 模拟原服务的方法/属性 } // 在TestBed中替换 providers: [ MyService, { provide: AppContextService, useClass: MockAppContextService }, { provide: HttpService, useClass: MockHttpService } ]
3. 检查AppContextService的装饰器
确保AppContextService正确添加了@Injectable装饰器,没有这个装饰器Angular无法将其识别为可注入的服务。
内容的提问来源于stack exchange,提问作者DMan
相关产品推荐
相关产品推荐

