firebase - 使用 @firebase/testing 连接到 Firestore 模拟器

标签 firebase unit-testing google-cloud-firestore firebase-cli

我正在尝试在本地测试 Firebase 应用程序。

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

在我的规范中,我导入 @firebase/testing并设置我的应用程序并按照以下说明进行操作
https://firebase.google.com/docs/rules/unit-tests

我有一个 FirebaseService这是我注入(inject) firebase 应用程序的方法的单例包装器。
在生产中,我将注入(inject) 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 key 与我的 Firebase 控制台中的 Web API key 匹配。

我还从我的 firebase 控制台和列表中下载了 google-services.json
{
 "api_key": [
  { "current_key": different_from_web_key}
  ]
}

而且我已经用这个新 key 替换了我现有的 key ,我仍然得到同样的错误。
我也试过设置initializeTestApp({ projectId })这就是 firebase docs 中的示例设置它的方式,我收到了相同的结果。

我正在使用相同的项目详细信息在 android studio 中本地运行项目,并且我能够进行身份验证并写入 firestore,因此我使用的 API key 确实有效,但它似乎在测试应用程序中使用了问题。

最佳答案

这通常没有特定的方法来解决它。即使是新的 API key 复制和粘贴到参数,也可能使其工作并且错误消失。

我建议您查看社区中的以下帖子,这些帖子对您面临的错误有一些可能的修复。

  • Firebase Error: auth/invalid-api-key, Your API key is invalid, please check you have copied it correctly
  • Invalid API Key supplied using Firebase

  • 除此之外,由于 Firebase 提供免费支持,我认为您可以联系 Firebase support将帮助您快速解决此问题。您应该可以直接联系 for free .

    让我知道这些信息是否对您有帮助!

    关于firebase - 使用 @firebase/testing 连接到 Firestore 模拟器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60539823/

    相关文章:

    javascript - react 路由器使用参数返回空对象

    ios - 如果我导入 Firebase,是否还包括 FirebaseAuth 和 FirebaseDatabase?

    reactjs - 过滤 Flatlist 时未定义不是对象

    unit-testing - 在 PHPUnit 中,为什么特定断言比通用断言更好?

    javascript - 有没有办法添加自定义方法来断言 chai 接口(interface)?

    javascript - 试图列出 Firestore 数据库的集合

    javascript - 为什么 Firestore 将金额存储为字符串而不是数字?

    firebase - 如何在同一项目中使用 Cloud Firestore 和实时数据库

    rest - https ://URLs 的 Firebase 存储 REST url 访问控制

    python - 模拟属性调用返回 MagicMock,而不是值