我有一个我想测试的angularfire2函数。我遇到的问题是我不知道如何模拟this.db.collection()
进行的匿名函数调用,以及如何模拟管道函数。我想测试传递给ref.orderBy函数的值以及管道返回的结果。我该怎么做?
sortedList(collection, orderByProperty){
return this.db.collection(collection, ref => {
return ref.orderBy(orderByProperty, 'asc')
})
.snapshotChanges().pipe(
map(actions => actions.map(a => {
const data = a.payload.doc.data();
const id = a.payload.doc.id;
return { id, ...data };
}))
);
}
..
import { TestBed } from '@angular/core/testing';
import { of } from "rxjs";
import { FirebaseService } from './firebase.service';
import { AngularFirestore } from '@angular/fire/firestore';
describe('FirebaseService', () => {
let service: FirebaseService;
const mockedData = [{
payload:{
doc:{
id:"zyx",
data:()=>{
return {hello:"world"}
}
}
},
},{
payload:{
doc:{
id:"abc",
data:()=>{
return {hello:"goodbye"}
}
}
}
}]
var afSpy = jasmine.createSpyObj('AngularFirestore', ['collection', 'snapshotChanges', 'pipe']);
afSpy.collection.and.returnValue(afSpy);
afSpy.snapshotChanges.and.returnValue(afSpy);
afSpy.pipe.and.returnValue(of(mockedData))
beforeEach(() => {
TestBed.configureTestingModule({
providers:[
{ provide: AngularFirestore, useValue: afSpy }
],
})
service = TestBed.get(FirebaseService); //get the testbed and set it so we can use it in our functions
});
it('should return a sorted list', () => {
service.sortedList('fakeCollection', 'id').subscribe(res=>{
expect(res).toEqual([{hello:"world", id:"zyx"}, {hello:"goodbye", id:"abc"}])
})
expect(afSpy.pipe).toHaveBeenCalled();
});
});
............................................... .......................................
答案 0 :(得分:0)
贾斯汀,这看起来很熟悉! :)
我在Stackblitz中设置了这个问题,类似于上一个问题。这次,我努力更改了尽可能少的代码,并保留了我希望的基本结构。以下是我想到的describe()
。 Stackblitz中的所有详细信息。
我还必须将FirebaseService添加到TestBed的providers数组中,以使规范能够正常运行。
这次snapshotChanges()
似乎返回了Observable,因此我将insideCollection
spyObject嵌套为collection()
方法的返回值,然后设置了{{1} },然后使用snapshotChanges()
到您的模拟数据数组的Observable。
正如您在Stackblitz中看到的那样,您的of()
规范运行得很好,就像您最初编写时没有修改一样。
it()
我希望这会有所帮助。 :)