我正在为firebasecloudfunction触发器编写测试。我遵循了这个fireship教程,第一个我写得很好,当用户创建一个新的Post时会调用触发器,它在用户文档中创建了一个新文档,它就工作了。
现在,如果用户更新存储在users/GC7QEZGBfcYw1tYXyoQfbsRw8ll1
中的个人信息,我将在userUpdate上触发它。它做了很多事情,比如获取所有朋友,在所有朋友中更新这个用户的基本信息,并在帖子中更新,但我得到了一个错误,即没有定义我在路径中提供的userId
我不知道我错过了什么。
我的第二个问题:是否可以在firebase模拟器中更新数据,而不是在线firebase?
这是我做的
initializeApp
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)
我还使用decorator来记录参数
并记录
arg 1未定义
看起来这是(目前(设计的,您必须传入一个包含通配符params的ContextOptions对象。有关详细信息,请参阅本期。
这样的事情应该会奏效,尽管必须多做这一步很奇怪。
// Execute it
await wrapped(after, {
params: {
userId: 'GC7QEZGBfcYw1tYXyoQfbsRw8ll1'
}
});