背景
我被投入这个项目以帮助缓解压力。麻烦的是,没有其他人这样做,所以我开创了事业。
我所知道的
我可以在本地获得lambda函数输出:
serverless invoke local -f getArticlesById -p localfile.json -s dev
并按预期返回JSON文章。
问题
我正在使用Jasmine来测试我的javascript lambda函数。如何在本地对这些无服务器环境功能进行单元测试?
当前尝试
我的lambda函数位于articles/articleHandler.js
。我有test/articles.js
运行jasmine
测试,利用lambda-tester
函数。每当我运行其中一个测试时,我都会收到错误
TypeError: Invalid hosts config. Expected a URL, an array of urls, a host config object, or an array of host config objects.
at new Transport (/Users/Jackson/Sites/serverless-content/node_modules/elasticsearch/src/lib/transport.js:59:13)
at new EsApiClient (/Users/Jackson/Sites/serverless-content/node_modules/elasticsearch/src/lib/client.js:57:22)
at Function.Client (/Users/Jackson/Sites/serverless-content/node_modules/elasticsearch/src/lib/client.js:101:10)
at Object.<anonymous> (/Users/Jackson/Sites/serverless-content-distribution-api-v2/elasticSearch.js:6:42)
at Module._compile (module.js:635:30)
at Object.Module._extensions..js (module.js:646:10)
at Module.load (module.js:554:32)
at tryModuleLoad (module.js:497:12)
at Function.Module._load (module.js:489:3)
at Module.require (module.js:579:17)
我发现这是由于将lambda函数包含在测试中引起的。当我注释掉那行时,我没有收到错误。我猜这是因为这不是serverless
调用,Elasticsearch对我的环境一无所知。
console.log("testing articles")
const LambdaTester = require("lambda-tester");
const articleHandler = require("../articles/articleHandler.js");
describe("articles getID()", function() {
it("test success", function() {
return LambdaTester(articleHandler.getID)
.event({pathParameters:{id:5633415102001}})
.expectResult(result => {
expect(result.body.data.id).to.be(5633415102001)
});
});
})
describe("articles getList()", function() {
it("test success", function() {
return LambdaTester(articleHandler.getList)
.event()
.expectResult(reset => {
expect(result.body.data.length).to.be(10);
});
});
});
**其他**
看起来lambda-tester
应该可以缓解我遇到的问题。今天会发现更多。
答案 0 :(得分:1)
使用lamba-tester,github页面上有一些例子。
我写了一个简单的lambda测试函数,然后用jasmine
+ lambda-tester
至于我的代码,我需要在其工作之前重构别人写的处理程序。我的简单测试看起来像:
无服务器yml
testLambda:
handler: test/testLambda.getValueOfA
role: arn:aws:iam::367839381035:role/CodeStarWorker-fx-srch-api-v1-Lambda
events:
- http:
path: test/testLambda/{a}
method: get
Lambda函数
module.exports.getValueOfA = (event, context, callback) => {
let a = 2;
if(event
&& event.pathParameters
&& !isNaN(event.pathParameters.a)
) a = event.pathParameters.a;
a = a+a;
let ret = "the value of a is " + a;
callback(null, ret);
}
<强>测试强>
const LambdaTester = require("lambda-tester");
const TestLambda = require("./testLambda.js");
describe("testLambda()", function() {
it("test success", function() {
let ret;
LambdaTester(TestLambda.getValueOfA)
.event()
.expectResult(result => {
console.log(result);
expect(result).toEqual("the value of a is 4");
});
});
});
我打算为参数设置这个但是没有达到目的。当然,这足以让任何人前进。
答案 1 :(得分:0)
另一个选择是直接从测试中调用该函数。最后,它不过是一个函数,因此您可以导入模块并调用它,并传递正确的参数。