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



我正在尝试在本地测试一个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,它是我的方法的单例包装器,我将firebase应用程序注入其中。在生产中,我将注入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工作室本地运行项目,并且我能够验证并写入firestore,所以我使用的API密钥确实有效,但在测试应用程序中使用它似乎有问题。

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

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

  • Firebase错误:auth/invalid-api-key,您的api密钥无效,请检查您是否正确复制了它
  • 使用Firebase提供的API密钥无效

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

如果这些信息对你有帮助,请告诉我!

相关内容

  • 没有找到相关文章

最新更新