Tengo problemas para realizar una prueba unitaria con el siguiente entorno:
"pubsub-js": "^1.9.2", "@types/chai": "^4.2.14", "@types/mocha": "^8.2.0", "chai": "^4.2.0", "firebase-functions-test": "^0.2.3", "mocha": "^8.2.1", "ts-node": "^9.1.1", "ts-sinon": "^2.0.1", Cuando publico un mensaje en mi pubsub, los datos que recibe siempre son: Message { data: undefined, attributes: {}, _json: undefined } y no puedo entender por qué.
Hay un código para describir mi escenario:
pubsub-myFunc.ts
export const pubsubMyFunc= functions.pubsub .topic("on-myTopic") .onPublish(async (message) => { console.log("version 1") console.log(message) /** * Received message from topic */ const myMessage = Buffer.from(message.data, "base64").toString("utf-8") pubsub-myFunc.spec.ts
import * as functions from 'firebase-functions'; import * as PubSub from 'pubsub-js'; import * as tsSinon from 'ts-sinon'; import { pubsubMyFunc } from './pubsub-myFuncr'; import * as sendEmail from './send-mail'; describe("PubSub tests", () => { beforeEach(() => { process.env.GCLOUD_PROJECT = "my env" }) it("Should call sendNotificationMessage", function (done) { // this.timeout(60000) const today = new Date() const data = { dateCreated: today, expireDate: today.getDate() + 30, objId: "id", objParentId: "parentId", } const spy = tsSinon.default.spy(sendEmail, "sendNotificationMessage") const dataBuffer = Buffer.from(JSON.stringify(data)) const pubsubMessage = new functions.pubsub.Message(dataBuffer) PubSub.subscribe("on-myTopic", pubsubMyFunc) console.log("publish") PubSub.publish("on-myTopic", pubsubMessage) setTimeout(() => { // check if spy was called tsSinon.default.assert.calledOnce(spy) done() }, 15000) }) }) He intentado pasar directamente el dataBuffer pero sin suerte, los resultados de los registros de mi consola son:
publish version 1 Message { data: undefined, attributes: {}, _json: undefined }¿Hay alguna razón para que mi Message.data no esté definido?
No estoy seguro de si la función de subscribe pubsub-js es compatible con la salida del método onPublish de onPublish firebase-functions .
Puede usar los emuladores de firebase para ejecutar sus funciones localmente y probarlas enviando mensajes como lo haría normalmente en lugar de pasar por pubsub-js .
export const pubsubMyFunc= functions.pubsub .topic("on-myTopic") .onPublish(async (message) => { console.log("version 1"); console.log(message); /** * Received message from topic */ const myMessage = message.json; ... Asegúrese de que pubsubMyFunc se exporte en el punto de entrada de funciones de firebase.
Instale y configure los emuladores de Firebase, asegúrese de que PUBSUB_EMULATOR_HOST env var esté configurado en localhost:$PORT donde $PORT esté configurado en el puerto que configuró para el emulador pub sub, ubicado en firebase.json en emulators.pubsub.port .
Una vez que todo esté configurado, puede enviar un mensaje a pubsub de la siguiente manera:
import {PubSub} from "@google-cloud/pubsub"; cont getTopic = () => { const topic = new PubSub().topic("on-myTopic"); topic.exists().then(([exists]) => exists ? topic : topic.create().then(([newTopic]) => newTopic) ); }; describe("PubSub tests", () => { let topic; beforeEach(async() => { process.env.GCLOUD_PROJECT = "my env" topic = await getTopic(); }); it("should test something", async() => { await topic.publishJSON(const data = { dateCreated: today, expireDate: today.getDate() + 30, objId: "id", objParentId: "parentId", }); // rest of your code here. }); });Esto funcionará en el proceso de pirateo.
export const pubsubMyFunc= functions.pubsub .topic("on-myTopic") .onPublish(async (message) => { console.log("version 1");