# #javascript #firebase #unit-testing #google-cloud-firestore #google-cloud-functions
Вопрос:
Настройка функций модульного тестирования firebase (онлайн-режим).
Я тестирую функцию onCreate (), поэтому мне нужно создать документ в firestore, чтобы убедиться, что функция запущена и работает должным образом. Проблема, с которой я сталкиваюсь, testEnv.firestore.makeDocumentSnapshot(data, path)
заключается в том, что я не создаю новый документ. Если документ уже существует, я могу записать в него эти данные и запустить функцию onCreate (), но если он не существует, я получаю сообщение Error: 5 NOT_FOUND: No document to update
при запуске теста.
тест.ts
const functions = require("firebase-functions-test"); const testEnv = functions({ databaseURL: "https://***.firebaseio.com", storageBucket: "***.appspot.com", projectId: "***", }, "./test-service-account.json"); import "jest"; import * as admin from "firebase-admin"; import { makeLowerCase } from "../src"; describe("makes bio lower case", () =gt; { let wrapped: any; beforeAll(() =gt; { wrapped = testEnv.wrap(makeLowerCase); }); test("it converts the bio to lowercase", async () =gt; { const path = "/animals/giraffe"; const data = {bio: "GIRAFFE"}; const snap = testEnv.firestore.makeDocumentSnapshot(data, path); await wrapped(snap) const after = await admin.firestore().doc(path).get(); expect(after?.data()?.bio).toBe("giraffe"); }); });
makeLowerCase.ts
import * as functions from "firebase-functions"; import * as admin from "firebase-admin"; export const makeLowerCase = functions.firestore .document("animals/{animalId}") .onCreate((snap, context) =gt; { const data = snap.data(); const bio = data.bio.toLowerCase(); return admin.firestore().doc(`animals/${snap.id}`).update({bio}); });
Я могу исправить это makeLowerCase.ts
, вернувшись:
admin.firestore().doc(`animals/${snap.id}`).set({bio}, {merge: true});
Или создав документ с администратором в тесте:
await admin.firestore().doc(path).set(data);
Но testEnv.firestore.makeDocumentSnapshot(data, path);
я думаю, что должен быть создан документ, нет?
Это ошибка или ожидаемое поведение firebase-functions-test"
?
Ответ №1:
makeDocumentSnapshot(data, path)
не будет создавать фактический документ, он только подделывает QueryDocumentSnapshot
объект без взаимодействия с какой — либо реальной базой данных-думайте об этом как о «создании объекта DocumentSnapshot».
Хотя ваша облачная функция может с полным правом предположить, что документ действительно существует, потому что именно так он запускается, вам придется написать документ в базу данных, чтобы он действовал, если вы хотите продолжать использовать update(...)
его вместо set(..., { merge: true })
этого .
Так что вам нужно будет, по крайней мере, добавить:
await admin.firestore().doc(path).set(data);
и тогда вы можете использовать любой из этих:
const snap = testEnv.firestore.makeDocumentSnapshot(data, path); // OR const snap = await admin.firestore().doc(path).get();