如何测试复杂的可观察链?

时间:2018-12-11 21:27:52

标签: angular unit-testing karma-jasmine angularfire2

我有一个我想测试的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();

});


});

............................................... .......................................

1 个答案:

答案 0 :(得分:0)

贾斯汀,这看起来很熟悉! :)

我在Stackblitz中设置了这个问题,类似于上一个问题。这次,我努力更改了尽可能少的代码,并保留了我希望的基本结构。以下是我想到的describe()。 Stackblitz中的所有详细信息。

我还必须将FirebaseService添加到TestBed的providers数组中,以使规范能够正常运行。

这次snapshotChanges()似乎返回了Observable,因此我将insideCollection spyObject嵌套为collection()方法的返回值,然后设置了{{1} },然后使用snapshotChanges()到您的模拟数据数组的Observable。

正如您在Stackblitz中看到的那样,您的of()规范运行得很好,就像您最初编写时没有修改一样。

it()

我希望这会有所帮助。 :)