Джастин, это выглядит знакомо!:)
Я установил эту проблему в Stackblitz , аналогичном последней проблеме.На этот раз я постарался изменить как можно меньше вашего кода, сохранив, как я надеюсь, вашу базовую структуру.Ниже describe()
, который я придумал.Все детали в Stackblitz.
Мне также пришлось добавить FirebaseService в массив провайдеров TestBed, чтобы спецификация работала без ошибок.
Похоже, snapshotChanges()
возвращает наблюдаемоена этот раз я вложил insideCollection
spyObject в качестве возвращаемого значения метода collection()
, а затем установил возвращаемое значение snapshotChanges()
в Observable вашего массива mockData, используя of()
.
Asвы можете видеть в Stackblitz, ваша it()
спецификация работает так же хорошо, как вы изначально написали ее без изменений.
describe('FirebaseService', () => {
let service: FirebaseService;
const mockedData = [{
payload:{
doc:{
id:"zyx",
data:()=>{
return {hello:"world"}
}
}
},
},{
payload:{
doc:{
id:"abc",
data:()=>{
return {hello:"goodbye"}
}
}
}
}]
var insideCollection = jasmine.createSpyObj('collection', ['snapshotChanges']);
var afSpy = jasmine.createSpyObj('AngularFirestore', ['collection']);
afSpy.collection.and.returnValue(insideCollection);
insideCollection.snapshotChanges.and.returnValue(of(mockedData));
// afSpy.pipe.and.returnValue(of(mockedData)) <-- .pipe is already a method on an Observable, no need for this.
beforeEach(() => {
TestBed.configureTestingModule({
providers:[
FirebaseService,
{ 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(insideCollection.snapshotChanges).toHaveBeenCalled();
});
});
Надеюсь, это поможет.:)