Как проверить сложную наблюдаемую цепочку? - PullRequest
0 голосов
/ 12 декабря 2018

У меня есть функция 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 голосов
/ 12 декабря 2018

Джастин, это выглядит знакомо!:)

Я установил эту проблему в 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();
  });


});

Надеюсь, это поможет.:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...