Angular5+Firestore测试报错:No provider类错误,添加Provider无效求助
我来帮你解决这个Angular5测试时遇到的Firestore/Auth依赖注入问题,毕竟在测试环境里处理Firebase这类第三方服务确实容易踩坑:
解决Angular5测试中Firestore/Auth依赖的NullInjectorError问题
首先要明确:测试环境的模块配置和生产环境是完全独立的,你在app.module.ts里添加的provider,不会自动作用于测试用的TestBed,所以得在测试文件里单独配置依赖项。
1. 在测试文件中手动配置TestBed
打开你的app.component.spec.ts,在beforeEach的测试模块配置里,要导入AngularFire相关模块,并明确提供需要的服务——甚至可以用模拟服务来避免依赖真实Firebase服务,让测试更快更稳定:
import { TestBed, async } from '@angular/core/testing'; import { AppComponent } from './app.component'; import { AngularFireModule } from '@angular/fire'; import { AngularFirestoreModule } from '@angular/fire/firestore'; import { AngularFireAuthModule } from '@angular/fire/auth'; import { AuthService } from './path-to-your-auth-service'; // 可选:写一个模拟AuthService,替代真实服务进行测试 class MockAuthService { // 模拟你业务中用到的方法,比如login、getCurrentUser等 login() { return Promise.resolve({ uid: 'test-user' }); } } describe('AppComponent', () => { beforeEach(async(() => { TestBed.configureTestingModule({ declarations: [AppComponent], imports: [ // 测试环境初始化AngularFire,用一个测试项目ID即可 AngularFireModule.initializeApp({ projectId: 'demo-test-project' }), AngularFirestoreModule, AngularFireAuthModule ], providers: [ // 两种选择:用真实服务就写AuthService,用模拟就替换成下面的配置 // AuthService { provide: AuthService, useClass: MockAuthService } ] }).compileComponents(); })); // 你的测试用例... });
2. 检查测试模块的导入完整性
很多时候问题出在测试时没导入AngularFirestoreModule和AngularFireAuthModule——只在app.module.ts里配置没用,因为TestBed是独立的测试模块环境,必须单独导入这些模块。
3. 确认版本兼容性
Angular5对应的AngularFire版本是@angular/fire@5.x.x,请检查你的package.json里的依赖版本是否匹配,版本不兼容也会导致依赖注入失败。
4. 检查tsconfig.json的类型配置
确保tsconfig.json的compilerOptions.types里包含测试需要的类型,避免类型解析问题:
{ "compilerOptions": { // ...其他配置 "types": [ "jasmine", "node" ] } }
内容的提问来源于stack exchange,提问作者Rentian Dong
相关产品推荐
相关产品推荐

