【问题标题】:how to test firestore methods如何测试firestore方法
【发布时间】:2019-06-04 05:14:15
【问题描述】:

我有以下问题:

我想测试以下使用 Firestore 的方法:

databaseService.ts

import {Injectable} from '@angular/core';
import {AngularFirestore} from '@angular/fire/firestore';

@Injectable({
  providedIn: 'root'
})

export class DatabaseService {
  constructor(private afs: AngularFirestore) {
  }

  pushToDatabase(subject: string, key: string, object: Object): void {
    this.afs.collection(subject).doc(key).set(JSON.parse(JSON.stringify(object)));
  }

  async getData(subject: string, key: string): Promise<firebase.firestore.DocumentData> {
    const document = await this.afs.collection(subject).doc(key).ref.get();
    return document.data();
  }
  async deleteData(subject: string, key: string) {
    return await this.afs.collection(subject).doc(key).delete();
  }
}

databaseService.spec.ts

import {TestBed} from '@angular/core/testing';
import {DatabaseService} from './database.service';
import {AngularFirestore, AngularFirestoreModule} from '@angular/fire/firestore';
import {LoginComponent} from '../../components/login/login.component';
import {HttpClientTestingModule} from '@angular/common/http/testing';
import {InjectionToken} from '@angular/core';
import {AngularFireModule} from '@angular/fire';
import {async} from 'q';
import {AuthService} from '../auth/auth.service';
import {Router} from '@angular/router';
import {GithubService} from '../github/github.service';

export class AngularFirestoreMock {
}

describe('DatabaseService', () => {

  let sut: DatabaseService;
  let angularFireStore: AngularFirestore;

  beforeEach(() => {
    TestBed.configureTestingModule({
      providers: [DatabaseService, AngularFirestore]
    });

    TestBed.overrideComponent(LoginComponent, {
      set: {
        providers: [
          {provide: AngularFirestore, useClass: AngularFirestoreMock}
        ]
      }
    });

    sut = TestBed.get(DatabaseService);
    angularFireStore = TestBed.get(AngularFirestore);

  });

  describe('#pushToDatabase', async () => {
    it('should push data', function () {

    });
  });
});

但我不知道如何开始。我找到并安装了firestore-mock 库。但即使有了这个库,我也不知道如何进行。

有人可以帮帮我吗?

【问题讨论】:

  • @dmcgrandle 你能帮帮我吗?
  • @Francisco Mateo 我做了,但我不知道如何将它与茉莉花一起使用。
  • 请用您迄今为止尝试过的内容更新您的答案,以便其他人可以尝试提供帮助。
  • @Francisco Mateo 已编辑!

标签: typescript firebase jasmine google-cloud-firestore


【解决方案1】:

这对我来说是测试 AngularFirestore 的基本设置:

{
    const fakeAFS = jasmine.createSpyObj( 'AngularFirestore', [ 'collection' ]);
    fakeAFS.collection.and.returnValue(jasmine.createSpyObj( 'collection', [ 'doc', 'snapshotChanges', 'valueChanges' ]));
    fakeAFS.collection().doc.and.returnValue(jasmine.createSpyObj( 'doc', ['valueChanges']));
    fakeAFS.collection().doc().valueChanges.and.returnValue( of('FakeDocument'));
    fakeAFS.collection().doc().update.and.returnValue(Promise.resolve(null));

    TestBed.configureTestingModule({
        providers: [
            { provide: AngularFirestore, useValue: fakeAFS }
        ]
     });
}

然后,对于测试:

{
   it('Fake afs should work', () => {

        const collectionRef = fakeAFS.collection('TestCollectionName').doc('FAKE-ID').valueChanges();

        expect(fakeAFS.collection).toHaveBeenCalledWith('TestCollectionName');
        expect(fakeAFS.collection().doc).toHaveBeenCalledWith('FAKE-ID');
        expect(collectionRef).toBeTruthy();
    });
   it('Fake AFS Update should work', async () => {
       const testUpdate = await fakeAFS.collection().doc().update();

       expect(testUpdate).toBe(null);
    });
}

【讨论】:

  • 我真的不知道如何改变它来测试 doc.update 方法返回的承诺。你知道怎么做吗?
  • @Marcel 我已经更新了我的答案以专门解决 doc().update() 命令。希望对您有所帮助!
猜你喜欢
  • 2019-02-15
  • 2019-12-29
  • 2016-11-02
  • 2017-05-06
  • 2016-09-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多