typescript - 在 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 未定义
解决方案
看起来这是(当前)设计的,您必须传入一个包含通配符 params的 ContextOptions 对象。有关更多信息,请参阅此问题。
这样的事情应该可以工作,尽管不得不做这个额外的步骤很奇怪。
// Execute it
await wrapped(after, {
params: {
userId: 'GC7QEZGBfcYw1tYXyoQfbsRw8ll1'
}
});
推荐阅读
- javascript - 如何将参数从剃刀发送到 JavaScript 函数
- ruby-on-rails - 如何修复“SQLite3::SQLException:没有这样的列:{table_name}.{singular_table_name}_id:”
- powershell - JIRA Cloud API GET 请求 - 适用于 Postman,但不适用于 Powershell
- permissions - Umbraco:如何检查是否允许成员以编程方式访问页面
- java - 素数分解计算器中的 For 循环显示合数,并且循环不会重新启动
- sql-server - 适用于 Azure Key Vault 的 SQL Server 连接器与 SQL 2017 开发人员版是否可行?
- c# - MassTransit - 多个消费者都可以收到相同的消息吗?
- sbt - 使用 sbt 查找包含 jar 的项目
- python - 子进程在持久性反向 Shell 程序中停止进程
- sql-server - 得到“外部表不是预期的格式。” 尝试在 SSIS 中导入 Excel 文件时出错