簡體   English   中英

如何用玩笑重置我的 Cloud Functions 的 Firestore 單元測試

[英]How to reset firestore unit testing my Cloud Functions with jest

我遵循 Cloud Functions 建議並在在線模式下創建了我的單元測試,一切對我來說都很有意義,但是在調試時我變得不一致。 我只是試圖通過重置和播種數據庫來重置 Firestore state。

當我單獨運行我的測試套件時,它們運行良好; 如果我一起運行所有測試套件出現所有錯誤,我很確定這與 beforeEach 掛鈎有關,但我不知道如何修復它們。

我有 3 個測試套件,我將與您分享其中 1 個以及負責重置 Firestore 的 function。

// eslint-disable-next-line spaced-comment
    /// <reference types="jest" />

    import { cleanup, getDb, initializeFirebase, makeChange, resetDb, wrap } from './util';
    initializeFirebase();

    import { streamerIsOffline, streamerIsOnline } from './__fixtures__/onStreamerUpdateSnaps';
    import { getScheduler, SchedulerClientWrapper } from './../utils/SchedulerClientWrapper';
    import onStreamerUpdate from '../onStreamerUpdate';

    const db = getDb();

    jest.mock('./../utils/SchedulerClientWrapper');

    const mockedGetScheduler = jest.mocked(getScheduler, true);

    const wrapped = wrap(onStreamerUpdate);

    const schedulerClientWrapper = new SchedulerClientWrapper();
    const mockedPause: jest.Mock = jest.fn();
    const mockedResume: jest.Mock = jest.fn();
    const mockedJobIsEnabled: jest.Mock = jest.fn();


    schedulerClientWrapper.pause = mockedPause;
    schedulerClientWrapper.resume = mockedResume;
    schedulerClientWrapper.jobIsEnabled = mockedJobIsEnabled;

    describe('onStreamerUpdate', () => {
      beforeEach(
          async () => {
            await resetDb(); //I am resetting firestore here
            mockedGetScheduler.mockClear();
            jest.resetAllMocks();
          });

      it('should resume the scheduledJob when the first streamer becomes online',
          async () => {
            await updateStreamerStatus('64522496', true); //I am preparing the setup here

            const beforeSnap = streamerIsOffline;
            const afterSnap = streamerIsOnline;

            const change = makeChange(beforeSnap, afterSnap);

            mockedGetScheduler.mockReturnValue(schedulerClientWrapper);

            mockedJobIsEnabled.mockResolvedValue(false);

            await wrapped(change);

            expect(mockedJobIsEnabled).toBeCalled();
            expect(mockedResume).toBeCalled();
            expect(mockedPause).not.toBeCalled();
          });
          
      afterAll(() => {
        cleanup();
      });
      
    });

    const updateStreamerStatus = async (streamerId: string, isOnline: boolean) => {
      const stremersRef = db.collection('streamers');

      const query = stremersRef.where('broadcasterId', '==', streamerId);
      const querySnapshot = await query.get();
      console.log('streamers', (await stremersRef.get()).docs.map((doc) => doc.data())); //I am debugging here
      const streamerDocId = querySnapshot.docs[0].id;
      await stremersRef.doc(streamerDocId).update({ isOnline });
    };

您可以在下面找到擦除和播種 Firestore 的功能:

import firebaseFunctionsTest from 'firebase-functions-test';
import { getApp, getApps, initializeApp, cert } from 'firebase-admin/app';
import { getFirestore } from 'firebase-admin/firestore';

const projectId = 'latamqchallengetest';

export const { wrap, cleanup, firestore: firestoreTestData, makeChange } = firebaseFunctionsTest({
  databaseURL: `https://${projectId}.firebaseio.com`,
  storageBucket: `${projectId}.appspot.com`,
  projectId: projectId,
}, './../google-credentials/latamqchallengetest-firebase-adminsdk.json');

export const initializeFirebase = () => {
  if (getApps().length <= 0) {
    initializeApp({
      credential: cert('./../google-credentials/latamqchallengetest-firebase-adminsdk.json'),
    });
  }
  return getApp();
};

export const getDb = () => {
  initializeFirebase();
  const db = getFirestore();
  return db;
};

export const wipeDb = async () => {
  const db = getDb();
  const collections = await db.listCollections();
  const deletePromises = collections.map((collectionRef) =>
    db.recursiveDelete(collectionRef));

  Promise.all([...deletePromises]);
};

export const seed = async () => {
  const db = getDb();
  await db.collection('streamers').add({
    broadcasterId: '64522496',
    broadcasterName: 'ITonyl',
    color: '1565C0',
    description: 'Sr. Truchita',
    isOnline: false,
    puuid: 'kRQyIDe5TfLhWtn8jXgo_4Zjlfg4rPypXWiPCXrkTMUsiQT3TYVCkVO6Au3QTdd4x-13CbluPA53dg',
    summonerId: '9bnJOmLXDjX-sgPjn4ZN1_-f6m4Ojd2OWlNBzrdH0Xk2xw',
  });
  await db.collection('streamers').add({
    broadcasterId: '176444069',
    broadcasterName: 'Onokenn',
    color: '424242',
    description: 'El LVP Player',
    isOnline: false,
    puuid: 'Gbfj8FyB6OZewfXgAwvLGpkayA6xyevFfEW7UZdrzA6saKVTyntP4HxhBQFd_EIGa_P1xC9eVdy8sQ',
    summonerId: 'pPWUsvk_67FuF7ky1waWDM_gho-3NYP4enWTtte6deR3CjxOGoCfoIjjNw',
  });
};

export const resetDb = async () => {
  await wipeDb();
  await seed();
};

有時我發現 firestore 有 4 條記錄,有時它有 0 條記錄、2 條記錄等等。我不知道為什么我在每次測試之前等待承諾。

我希望在每次測試之前保持相同的 state,你能幫幫我嗎?

所有的問題都是 jest 的並行行為,我只需要使用參數--runInBandmaxWorkers=1順序運行測試

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM