首页 > 解决方案 > 在 onUpdate Trigger Typescript 中未定义使用 Jest 和 context.params.userId 测试我的 cloudfunction

问题描述

我正在为我的 firebase cloudfunction 触发器编写测试。我按照这个火船教程第一个我写得很好,当用户创建一个新帖子时调用触发器,它在用户文档中创建一个新文档并且它工作。

现在我第二次触发它在 userUpdate 上,如果用户更新存储在users/GC7QEZGBfcYw1tYXyoQfbsRw8ll1. 它做了很多事情,比如获取所有朋友并在所有朋友中更新该用户的基本信息并在帖子中更新,但我收到错误,即我在路径中提供的 userId 未定义

我不知道我错过了什么。

我的第二个问题:是否可以在 firebase 模拟器而不是在线 firebase 中更新数据?

这就是我所做的

初始化应用

import * as admin from "firebase-admin";
admin.initializeApp({
  credential: admin.credential.cert({
    projectId: "firebase project ID",
    privateKey:
      "-----BEGIN PRIVATE KEY-----\$Key=\n-----END PRIVATE KEY-----\n",
    clientEmail:
      "clientEmail from firebase",
  }),
  databaseURL: "firebase database url",
});
import functions from "firebase-functions-test";
const testEnv = functions({
  databaseURL: "firebase database url",
  projectId: "firebase project id",
});

测试代码

import "jest";
describe("On Update User", () => {
  test("It update user info in all friends & Events", async () => {
    const wrapped = testEnv.wrap(onUpdateUser);
    const path = "users/GC7QEZGBfcYw1tYXyoQfbsRw8ll1";
    const data1 = {
      avatarUrl: "avatarUrl",
      bio: "bio",
      last_name_lower: "ben",
      name: "Ben",
      name_lower: "ben",
      username: "ben",
    };
    const data2 = {
      avatarUrl: "avatarUrl",
      bio: "bio",
      last_name_lower: "khan",
      name: "Khan",
      name_lower: "khan",
      username: "khan007",
    };
    const snap1 = testEnv.firestore.makeDocumentSnapshot(data1, path);
    const snap2 = testEnv.firestore.makeDocumentSnapshot(data2, path);
    const change = testEnv.makeChange(snap1, snap2);

    // Execute it
    await wrapped(change);

  });
});

我使用 firebase 模拟器来测试所有触发器并且一切正常,但是使用 jest 我遇到了这个问题

我得到的第一个错误是

参数“documentPath”的值不是有效的资源路径。路径必须是非空字符串。

firestore.collection("friends").doc(userId)

at Object.validateResourcePath (../node_modules/@google-cloud/firestore/build/src/path.js:406:15)
      at CollectionReference.doc (../node_modules/@google-cloud/firestore/build/src/reference.js:1982:20)
      at Function.ref (models/friends.ts:44:44)
      at Function.descriptor.value (decorators/log.ts:18:31)
      at Function.fromId (models/friends.ts:33:29)
      at Function.descriptor.value (decorators/log.ts:18:31)
      at Function.exports.onUpdateUser.functions.firestore.document.onUpdate [as run] (users/onUpdateUser.ts:23:37)
      at wrapped (../node_modules/firebase-functions-test/lib/main.js:71:30)
      at Object.test (test/userUpdate.test.ts:35:11)

我也使用装饰器来记录参数

它记录

arg 1 未定义

标签: typescriptfirebasejestjsgoogle-cloud-functionsfirebase-cli

解决方案


看起来这是(当前)设计的,您必须传入一个包含通配符 params的 ContextOptions 对象。有关更多信息,请参阅此问题

这样的事情应该可以工作,尽管不得不做这个额外的步骤很奇怪。

// Execute it
await wrapped(after, {
  params: {
    userId: 'GC7QEZGBfcYw1tYXyoQfbsRw8ll1'
  }
});

推荐阅读