【发布时间】:2021-04-22 02:15:27
【问题描述】:
我目前正在探索 Firebase Cloud Functions 中的单元测试,并遇到了一个用例,该用例似乎很频繁,但官方文档并未涵盖。
在为各种进程和触发器编写 Cloud Functions 时,我们通常会使用单独的辅助函数来帮助我们编写更多可重用的代码。例如:
// index.ts
import * as functions from "firebase-functions";
function add(num1: number, num2: number) {
return num1 + num2;
}
exports.getSum = functions.https.onCall((data, context) => {
return {
result: add(data.num1, data.num2)
}
})
当我现在想测试getSum 时,我必须将它导入我的测试文件并做出断言。但是,这是我遇到问题的地方:
如何断言add 已在getSum 中调用?或者更好:我如何模拟add?
到目前为止,我发现的唯一解决方法是同时导出 add,然后修改代码以调用 this.add 而不仅仅是 add,如下所示:
// index.ts
import * as functions from "firebase-functions";
export function add(num1: number, num2: number) {
return num1 + num2;
}
exports.getSum = functions.https.onCall((data, context) => {
return {
// @ts-ignore
result: this.add(data.num1, data.num2)
}
})
但是这个解决方案并不理想,因为我 1. 不能保证 this 不是未定义的(这也是我需要 // @ts-ignore 的原因)和 2. 需要修改原始代码进行测试工作。
有什么方法可以在不修改函数代码的情况下完成这项工作?测试这些辅助函数的任何最佳实践?提前谢谢!
这是我用于解决方法的完整单元测试代码:
// index.unit.test.ts
const testEnvironment = require("firebase-functions-test")(
{
databaseURL: "",
storageBucket: "",
projectId: "",
},
"credentials.json"
);
const myFunctions = require("../src/index");
describe("getSum", () => {
let wrapper: any, group: any;
beforeAll(() => {
group = myFunctions.addition
wrapper = testEnvironment.wrap(group.getSum);
});
it("adds two numbers", () => {
group.add = jest.fn()
wrapper({ num1: 2, num2: 2})
expect(group.add).toHaveBeenCalled()
});
});
【问题讨论】:
标签: typescript firebase unit-testing jestjs google-cloud-functions