簡體   English   中英

使用@firebase/testing 連接到 Firestore 模擬器

[英]connecting to firestore emulator with @firebase/testing

我正在嘗試在本地測試 firebase 應用程序。

我正在使用firebase emulators:exec --only firestore 'mocha -r ts-node/register src/**/*.spec.ts運行測試firebase emulators:exec --only firestore 'mocha -r ts-node/register src/**/*.spec.ts

在我的規范中,我導入@firebase/testing並設置我的應用程序並按照https://firebase.google.com/docs/rules/unit-tests 中的說明進行操作

我有一個FirebaseService ,它是我的方法的單例包裝器,我將我的FirebaseService應用程序注入其中。 在生產中,我將注入 firebase,並在測試時在FirebaseService中對其進行初始化,然后在服務外部進行初始化。

包裝器相當簡單


export const FirebaseService = (function(): FirebaseSrvc {
  let firebase;
  const fbServiceObj: FirebaseSrvc = {
    getInstance: (firebaseConfig, firebaseCore, initialize) => {
      firebase = firebaseCore;
      if (initialize && firebase.apps.length === 0) {
        firebase.initializeApp(firebaseConfig);
      }

      return fbServiceObj;
    },


    createActivity: async (title: string) => {
      try {
        const firebaseUid = firebase.auth().currentuser.uid;
        const newActivity: ActivityProps = {
          title,
          created_at: 123445,
          created_by: firebaseUid,
          public: false,
          available_to: [firebaseUid],
        };
        console.log(' before create', newActivity);
        const createResponse = await firebase
          .firestore()
          .collection('activities')
          .doc(stringToSafeId(title))
          .set(newActivity);
        console.log('create response', createResponse);
        return true;
      } catch (e) {
        console.log('error creating activity', e);
      }
    },

    getActivity: async (title: string): Promise<ActivityProps> => {
      try {
        const actResponse: DocumentReferenceTo<ActivityProps> = await firebase
          .firestore()
          .collection('activities')
          .doc(stringToSafeId(title))
          .get();
        return actResponse as ActivityProps;
      } catch (e) {
        console.log('error getting activity from firebase', e);
      }
    },
  };

  return fbServiceObj;
})();

我試圖運行的測試是

import * as firebase from '@firebase/testing';
import { assert } from 'chai';
import 'mocha';
import * as appConfig from '../../app-dev.json';
import { FirebaseService } from '../services/FirebaseService';

firebase.initializeTestApp({ ...appConfig.expo.extra.firebase, auth: { uid: 'random', email: 'test@test.com' } });


describe('Activity', async () => {
  const fb = FirebaseService.getInstance(appConfig.expo.extra.firebase, testApp, false);
  const activityData = new Activity(fb);
  beforeEach(async () => await firebase.clearFirestoreData({ projectId }));

  it('should create a new activity', async () => {
    await activityData.set('test-activity'); // this runs FirebaseService.createActivity
    const findActivity = await activityData.get('test-activity'); // this run FirebaseService.getActivity
    assert(findActivity.title === 'test-activity');
  });
});

當我運行測試時出現錯誤

Your API key is invalid, please check you have copied it correctly.] {
  code: 'auth/invalid-api-key',
  message: 'Your API key is invalid, please check you have copied it correctly.'
}

我可以確認傳遞給firebase.initializeTestApp的 API 密鑰與我的 firebase 控制台中的 Web API 密鑰匹配。

我還從我的 firebase 控制台和列表中下載了 google-services.json

{
 "api_key": [
  { "current_key": different_from_web_key}
  ]
}

我已經用這個新密鑰替換了我現有的密鑰,我仍然遇到同樣的錯誤。 我還嘗試設置initializeTestApp({ projectId }) ,這是 firebase 文檔中的示例如何設置它的,我收到了相同的結果。

我正在使用相同的項目詳細信息在 android studio 中本地運行一個項目,並且我能夠進行身份驗證並寫入 firestore,因此我使用的 API 密鑰確實有效,但它似乎在測試應用程序中使用時存在問題。

這通常沒有特定的方法來解決它。 可能即使是將 API 密鑰的新復制和粘貼到參數,也可能使其工作並且錯誤消失。

我建議您查看社區中的以下帖子,這些帖子對您面臨的錯誤有一些可能的修復方法。

除此之外,由於 Firebase 提供免費支持服務,我認為您聯系Firebase 支持將幫助您快速解決此問題。 您應該可以直接免費聯系。

如果這些信息對您有幫助,請告訴我!

暫無
暫無

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

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