testEnv.firestore.makeDocumentSnapshot(данные, путь) не создает новый документ

# #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();