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

如何解决NullInjectorError: No provider for AppContextService错误?

解决Angular NullInjectorError: No provider for AppContextService! 的问题

问题根源

你的代码存在两个关键冲突点:

  1. MyService同时通过@Injectable({providedIn: 'root'})(根注入器)和模块的providers数组注册,导致注入器逻辑混乱。
  2. 错误栈中的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 10:42:49