如何在本地测试无服务器的lambda函数?

时间:2017-11-09 23:58:13

标签: aws-lambda

背景

我被投入这个项目以帮助缓解压力。麻烦的是,没有其他人这样做,所以我开创了事业。

我所知道的

我可以在本地获得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对我的环境一无所知。

测试/ article.js

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应该可以缓解我遇到的问题。今天会发现更多。

2 个答案:

答案 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)

另一个选择是直接从测试中调用该函数。最后,它不过是一个函数,因此您可以导入模块并调用它,并传递正确的参数。