Configuración de las funciones de firebase de pruebas unitarias (modo en línea).
Estoy probando una función onCreate(), por lo que necesito crear un documento en firestore para asegurarme de que la función se active y funcione correctamente. El problema que encuentro es que testEnv.firestore.makeDocumentSnapshot(data, path) no está creando un nuevo documento. Si el documento ya existe, puedo escribirle estos datos y activar la función onCreate(), pero si no existe obtengo un Error: 5 NOT_FOUND: No document to update cuando ejecuto la prueba.
prueba.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", () => { let wrapped: any; beforeAll(() => { wrapped = testEnv.wrap(makeLowerCase); }); test("it converts the bio to lowercase", async () => { 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"); }); });hacerLowerCase.ts
import * as functions from "firebase-functions"; import * as admin from "firebase-admin"; export const makeLowerCase = functions.firestore .document("animals/{animalId}") .onCreate((snap, context) => { const data = snap.data(); const bio = data.bio.toLowerCase(); return admin.firestore().doc(`animals/${snap.id}`).update({bio}); }); Puedo arreglar esto en makeLowerCase.ts devolviendo:
admin.firestore().doc(`animals/${snap.id}`).set({bio}, {merge: true});O creando el documento con admin en la prueba:
await admin.firestore().doc(path).set(data); Pero testEnv.firestore.makeDocumentSnapshot(data, path); debería estar creando un documento, creo, ¿no?
¿Es este un error o un comportamiento esperado de firebase-functions-test" ?
makeDocumentSnapshot(data, path) no creará un documento real, solo falsifica un objeto QueryDocumentSnapshot sin interactuar con ninguna base de datos real; piense en ello como "hacer un objeto DocumentSnapshot".
Si bien su Cloud Function puede asumir correctamente que el documento existe porque así es como se activa, tendría que escribir un documento en la base de datos para que actúe si desea seguir usando update(...) en su lugar. de set(..., { merge: true }) .
Por lo tanto, deberá agregar al menos:
await admin.firestore().doc(path).set(data);y luego puedes usar cualquiera de estos:
const snap = testEnv.firestore.makeDocumentSnapshot(data, path); // OR const snap = await admin.firestore().doc(path).get();