Reaz 在他的回答中推荐了 MockFirebase。但是,MockFirebase 不适用于 Firebase 3。有一个名为 firebase-mock 的库,它似乎是由一些与 MockFirebase 相同的人开发的。这增强了 MF,增加了对 Firebase 3 的支持,但是它doesn't appear to play nicely with WebPack yet。
这是我最终做的:
我突然想到 FirebaseListObservable 继承自 RXJS 的 Observable。因此,您可以模拟对 list 的 AngularFire 调用并让它返回您自己的 Observable。
一些示例代码显示了这一点:
todos.service.spec.ts
let fixtureTodos = [
{ 'text': 'Get milk' },
{ 'text': 'Take out the trash' },
{ 'text': 'Get gas for the car' },
{ 'text': 'Pay parking ticket' },
{ 'text': 'Pick up dry cleaning' },
];
let angularFireDatabaseStub = { list: () => {} };
let mockTodos$ = Observable.of(fixtureTodos);
describe('TodosService', () => {
beforeEach(() => {
spyOn(angularFireDatabaseStub, 'list').and.returnValue(mockTodos$);
TestBed.configureTestingModule({
providers: [
TodosService,
{ provide: AngularFireDatabase, useValue: angularFireDatabaseStub },
]
});
});
it('#getAll', inject([TodosService], (service: TodosService) => {
let todos$ = service.getAll();
todos$.subscribe(todos => {
expect(todos[0].text).toEqual(fixtureTodos[0].text);
expect(todos[0]).toEqual(jasmine.any(Todo));
});
}));
});
todos.service.ts
@Injectable()
export class TodosService {
constructor(public db: AngularFireDatabase) { }
getAll(): Observable<Todo[]> {
return this.db.list('todos').map(arr => {
return arr.map(t => new Todo(t.text));
});
}
}
todo.model.ts
export class Todo {
constructor(public text: string) {}
}