Я пытаюсь протестировать приложение Firebase локально.
Я запускаю тест с firebase emulators:exec --only firestore 'mocha -r ts-node/register src/**/*.spec.ts
В моей программе c я импортирую @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.'
}
. Я могу подтвердить, что ключ API, переданный в firebase.initializeTestApp
, соответствует Web API Key в моей консоли Firebase.
Я также скачал google-services. json из моей консоли Firebase и перечисляет
{
"api_key": [
{ "current_key": different_from_web_key}
]
}
И я заменил свой существующий ключ этим новый ключ, я все еще получаю ту же ошибку. Я также попытался настроить initializeTestApp({ projectId })
, как это делается в примере из документации Firebase, и я получаю тот же результат.
Я использую те же детали проекта для локального запуска проекта в android Studio, и я могу проходить проверку подлинности и писать в firestore, поэтому используемый мной ключ API работает, но, похоже, возникают проблемы при использовании в тестовом приложении.