我目前正在调查Google Cloud Functions,并使用typescript编写了一些基本的测试函数 .
这些函数按预期工作,我现在正尝试使用Jasmine创建单元测试 . (我不是按照文档使用Chai / sinon,因为我的项目的其余部分使用了jasmine) .
我有两个问题1)由于此错误,测试未运行
抛出新错误('Firebase配置变量不可用 . '^错误:Firebase配置变量不可用 . 请使用最新版本的Firebase CLI部署此功能
2)鉴于测试确实运行,我不确定如何测试响应是否符合预期 .
索引文件
import * as functions from 'firebase-functions'
import { helloWorldHandler } from './functions/hello-world';
export let helloWorld = functions.https.onRequest((req, res) => {
helloWorldHandler(req, res);
});
正在测试的文件
export let helloWorldHandler = (request, response) => {
response.send("Hello from Firebase Cloud!");
}
规格
import {} from 'jasmine';
import * as functions from 'firebase-functions'
import { helloWorldHandler } from './hello-world';
import * as endpoints from '../index';
describe('Cloud Functions : Hello World', () => {
let configStub = {
firebase: {
databaseURL: "https://myProject.firebaseio.com",
storageBucket: "myProject.appspot.com",
}
};
it('should return correct message', () => {
let spy = spyOn(functions, 'config').and.returnValue(configStub);
const expected = 'Hello from Firebase Cloud!';
// A fake request and response objects
const req : any = {};
const res : any = { };
endpoints.helloWorld(req, res);
//here test response from helloWorld is as expected
});
});
1 回答
如果您正在编写单元测试,那么您不想测试第三方API . 因此,目标应该是隔离代码逻辑并测试它 . 端到端测试最适合对集成进行回归测试 .
所以这里的第一步是从图片中删除像
firebase-functions
和数据库SDK这样的工具(尽管这是合理的) . 我通过将我的libs与函数逻辑分开来实现这一点:现在我有一个很好的隔离逻辑,我可以通过单元测试来测试 . 我模拟了传递给我的方法的任何参数,从图片中删除第三方API .
所以这是我在Jasmine中测试的单元的样子:
测试第三方库有很多复杂性 . 这里最好的答案是将早期的TDD / BDD原则和抽象的第三方库应用到易于嘲笑的服务中 .
例如,如果我在我的函数中与Firebase Admin进行交互,我可能很容易得到一个具有许多第三方依赖关系的方法:
要测试此示例,我必须包含和初始化函数以及Firebase Admin SDK,或者我必须找到模拟这些服务的方法 . 所有这些看起来都非常重要 . 相反,我可以拥有DataStore抽象并利用它:
如果我现在添加从函数进程中抽象逻辑的第一个原则,那么我有如下布局:
允许我编写一个更优雅的单元测试:
我的代码的其余部分也不是一半坏:
更不用说从良好的BDD心态开始,我也很好地以模块化的方式隔离了我的项目的组件,当我们发现阶段2中的所有范围蠕变时,这将是很好的 . :)