【问题标题】:nodejs unit test PubSub.publish not sending datanodejs单元测试PubSub.publish不发送数据
【发布时间】:2021-03-03 19:05:26
【问题描述】:

我在使用以下环境进行单元测试时遇到问题:

"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",

当向我的 pubsub 发布消息时,它收到的数据总是:Message { data: undefined, attributes: {}, _json: undefined },我不知道为什么。

有一些代码可以描述我的场景:

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)
  })
})

我尝试直接传递dataBuffer,但也没有任何运气,我的控制台日志的输出是:

publish
version 1
Message { data: undefined, attributes: {}, _json: undefined }

我的 Message.data 是否有任何原因未定义?

【问题讨论】:

  • 能否分享一个可运行的代码,以便我们提供更好的解决方案

标签: node.js typescript unit-testing google-cloud-pubsub


【解决方案1】:

我不确定pubsub-jssubscribe函数是否与firebase-functions'onPublish方法的输出兼容。

您可以使用 firebase 的模拟器在本地运行您的函数,并像往常一样发送消息来测试它们,而不是通过 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;
...

确保 pubsubMyFunc 在 firebase 函数入口点导出。

安装和配置firebase emulators,确保PUBSUB_EMULATOR_HOST env var 设置为localhost:$PORT,其中$PORT 设置为您为pub sub 模拟器配置的端口,位于firebase.jsonemulators.pubsub.port

设置完成后,您可以通过以下方式向 pubsub 发送消息:

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.
  });
});

【讨论】:

  • 试过了,但使用这个代码或类似的东西不会到达我的 pubsub。使用 pubsub-js 会到达它但不发送数据。
  • 你在这里看到你的主题了吗? console.cloud.google.com/cloudpubsub/topic/list 或者你的意思是它没有到​​达本地?
  • 没有到达 pubsub 中的控制台日志,模拟器中也没有任何日志
  • 您能否在导出触发器之前检查 env var PUBSUB_EMULATOR_HOST 是否已定义?
【解决方案2】:

这将在破解过程中起作用

   export const pubsubMyFunc= functions.pubsub
      .topic("on-myTopic")
      .onPublish(async (message) => {
         console.log("version 1");

【讨论】:

    猜你喜欢
    • 2018-01-26
    • 2023-03-04
    • 1970-01-01
    • 2022-01-11
    • 2018-10-01
    • 2011-08-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多