我正在尝试使用Karma和Jasmine来测试使用Firestore的Angular5。但是,当我进行“测试”时,我收到一条错误,上面写着“NullInjectorError:没有AngularFirestore / AngularFireAuth / AuthService的提供者!”。在NullInjectorError: No provider for AngularFirestore发布帖子后,我在app.module.ts中向提供者添加了AngularFirestore,AngularFireAuth和AuthService,但这并没有解决问题。
app.module.ts:
import { BrowserModule } from '@angular/platform-browser';
import { NgModule } from '@angular/core';
import { FormsModule } from '@angular/forms';
import { AuthService} from './core/auth.service';
// Routing and routes import
import { AppRoutingModule } from './app-routing.module';
import { AppComponent } from './app.component';
// Authentication Module
import { CoreModule } from './core/core.module';
// Firebase imports
import { environment } from '../environments/environment';
import { AngularFireModule } from 'angularfire2';
import { AngularFirestoreModule } from 'angularfire2/firestore';
import { AngularFireAuthModule } from 'angularfire2/auth';
import { AngularFireAuth } from 'angularfire2/auth';
import { AngularFireStorageModule } from 'angularfire2/storage';
import { UserProfileComponent } from './user-profile/user-profile.component';
import { ProjectsComponent } from './projects/projects.component';
import { AngularFirestore } from 'angularfire2/firestore';
@NgModule({
declarations: [
AppComponent,
UserProfileComponent,
ProjectsComponent
],
imports: [
BrowserModule,
AppRoutingModule,
AngularFireModule.initializeApp(environment.firebase, "life-planner"),
AngularFirestoreModule,
AngularFireAuthModule,
AngularFireStorageModule,
FormsModule,
CoreModule,
AuthService,
AngularFirestore,
AngularFireAuth
],
providers: [
AngularFirestore,
AuthService,
AngularFireAuth,
],
bootstrap: [AppComponent]
})
export class AppModule { }
tsconfig.json
{
"compileOnSave": false,
"compilerOptions": {
"paths": {
"@angular/*": [
"../node_modules/@angular/*"
]
},
"outDir": "./dist/out-tsc",
"sourceMap": true,
"declaration": false,
"moduleResolution": "node",
"emitDecoratorMetadata": true,
"experimentalDecorators": true,
"target": "es5",
"typeRoots": [
"node_modules/@types"
],
"lib": [
"es2017",
"dom"
]
}
}
app.component.spec.ts(测试代码):
import { TestBed, async } from '@angular/core/testing';
import { AppComponent } from './app.component';
import { RouterTestingModule } from '@angular/router/testing';
import {
AngularFirestore,
AngularFirestoreCollection,
AngularFirestoreDocument
} from 'angularfire2/firestore';
import { NgModule } from '@angular/core';
describe('AppComponent', () => {
beforeEach(async(() => {
TestBed.configureTestingModule({
declarations: [ AppComponent ],
imports: [
RouterTestingModule
]
}).compileComponents();
}));
it('should create the app', async(() => {
const fixture = TestBed.createComponent(AppComponent);
const app = fixture.debugElement.componentInstance;
expect(app).toBeTruthy();
}));
it(`should have as title 'app'`, async(() => {
const fixture = TestBed.createComponent(AppComponent);
const app = fixture.debugElement.componentInstance;
expect(app.title).toEqual('app');
}));
it('should render title in a h1 tag', async(() => {
const fixture = TestBed.createComponent(AppComponent);
fixture.detectChanges();
const compiled = fixture.debugElement.nativeElement;
expect(compiled.querySelector('h1').textContent).toContain('Welcome to app!');
}));
});
提前感谢任何帮助。
答案 0 :(得分:1)
服务AngularFirestore依赖于AngularFireModule的初始化以及您为实际代码所做的AngularFirestoreModule的导入。
对于测试,您没有该设置。哪个是正确的,理想情况下,您不应该从测试中调用实际的firestore数据库。所以解决方案是您需要存根服务。
const FirestoreStub = {
collection: (name: string) => ({
doc: (_id: string) => ({
valueChanges: () => new BehaviorSubject({ foo: 'bar' }),
set: (_d: any) => new Promise((resolve, _reject) => resolve()),
}),
}),
};
添加您正在使用的任何方法,此示例没有存根的所有可用方法。
然后提供该存根:
TestBed.configureTestingModule({
providers: [
{ provide: AngularFirestore, useValue: FirestoreStub },
],
});
归功于@ ksaifullah
答案 1 :(得分:0)
接受的答案是正确的,但如果愿意,他/她可以从测试中调出实际的Firestore数据库。只需以这种方式配置TestBed:
LOAD_STORE/ERROR
所以...实际上,您可以使用Karma和Jasmine对您的真实数据库运行单元测试。