使用AngularFire v7新初始化方法报错AngularFireModule未提供如何解决
AngularFire v7+ 测试连接模拟器报错排查方案
常见触发原因
- 未通过依赖注入获取
Firestore实例,仅声明变量未赋值,直接调用API触发依赖未初始化校验 projectId仅声明未赋值,Firebase配置不完整导致初始化失败- 测试环境下IndexedDB持久化冲突,打断了AngularFire的初始化流程
- AngularFire与Firebase、Angular版本不兼容,导致依赖注入链路断裂
修复步骤
- 补全测试用的Firebase配置,
projectId可以使用demo-开头的任意值,和模拟器启动参数的projectId保持一致即可,无需真实线上配置 - 在测试用例执行前从TestBed注入
Firestore实例,不要直接使用全局getFirestore()返回的实例 - 测试环境建议先关闭IndexedDB持久化,避免多轮测试的缓存冲突,如果需要开启要添加错误捕获逻辑
修复后的完整代码
import { TestBed } from '@angular/core/testing'; import { initializeApp, provideFirebaseApp } from '@angular/fire/app'; import { doc, Firestore, getFirestore, provideFirestore, setDoc } from '@angular/fire/firestore'; import { connectFirestoreEmulator } from "firebase/firestore"; describe('FirestoreEmulatorSmoketest', () => { // 补全测试用projectId,demo开头的ID会自动跳过线上权限校验 const projectId = 'demo-firestore-test'; let firestore: Firestore; beforeAll(() => { const testConfig = { projectId: projectId, // 其他配置如果不需要可以留空,模拟器场景下仅需要projectId即可 }; TestBed.configureTestingModule({ imports: [ provideFirebaseApp(() => initializeApp(testConfig)), provideFirestore(() => { const firestoreInstance = getFirestore(); connectFirestoreEmulator(firestoreInstance, 'localhost', 8080); // 测试环境不需要持久化可以注释,要开启的话添加catch避免冲突报错 // enableIndexedDbPersistence(firestoreInstance).catch(() => {}); return firestoreInstance; }), ], }); }); // 每次测试前注入Firestore实例 beforeEach(() => { firestore = TestBed.inject(Firestore); }); afterAll(() => {}) it('should connect', async () => { const fooDoc = doc(firestore, "foo/12345"); await setDoc(fooDoc, { updated: new Date() }); // 可自行补充断言验证写入结果 expect(true).toBeTrue(); }) });
额外校验点
- 启动Firebase模拟器时指定的projectId和代码里的保持一致,启动命令参考
firebase emulators:start --project demo-firestore-test - 验证依赖版本匹配:Angular 14对应
@angular/fire@7.4.x,Angular 15对应@angular/fire@7.5.x,Angular 16+对应@angular/fire@7.6+,firebase版本保持在9.x或10.x即可,不要跨大版本。
内容的提问来源于stack exchange,提问作者stevecowling
相关产品推荐
相关产品推荐

