使用jest和lambda-tester对AWS Lambda进行单元测试

时间:2017-09-21 19:45:53

标签: unit-testing aws-lambda jestjs

网上有很多关于如何测试AWS lambdas的帖子,以及如何模拟某些依赖项等。也许我过度简化,但我不需要任何这些。有一段时间,我一直在使用mocha / chai和lambda-tester。这适用于使用简单npm test运行测试。

我现在的问题是,因为我被引用来使用Jest而不是mocha / chai,所以我已经更新了所有的测试以匹配Jest语法(与大多数情况非常相似)。然而,现在,我的测试有时会通过,有时会失败。虽然这让我觉得我的测试没有正确处理异步,但我没有看到如何使用Jest文档并在我的代码中使用done,因为我相信lambda-tester会返回我期望的结果。

为了简单起见,我的一个Lambdas只返回一个图片网址。我的测试应该验证是否有statusCode:200并且标头具有内容类型属性。

这是我的测试,因为它是mocha / chai格式,当它一直通过(验证不是误报):

describe('Lambda to return imageURl:  ', () => {

  it('should return a status code 200 and have the correct header', () => {
    return LambdaTester( lambda.handler )
      .event( testEvent )
      .expectSucceed( ( result ) => {
        expect( result.statusCode ).to.equal(200);
        expect( result.headers ).to.have.property( 'Location' );
      });
  });
})

相当直接。现在,这是我在Jest中的更新测试,这是不一致的:

test('should return a status code 200 and have the correct header', () => {
  return LambdaTester( lambda.handler )
    .event( testEvent )
    .expectSucceed( ( result ) => {
      expect( result.statusCode ).toBe(200);
      expect( result.headers ).toHaveProperty( 'Content-Type' );
    });
});

我可能在转换为Jest时错过了一些内容,但我看不清楚是什么。希望有人能发现我的错误并帮助我前进。

1 个答案:

答案 0 :(得分:0)

您的代码似乎没有任何问题。

mochajest之间最大的区别之一是jest同时运行测试,因此它可以检测Lambda上处理程序之外的竞争条件和突变等问题mocha 1}}可能会错过。

我会解决这个问题:

  • 尝试多次运行该单个测试(该单个文件和使用test.only的单个测试)。
  • 尝试使用jest --runInBand串行运行整个套件。

如果我们遇到一致的失败,那么你可能会遇到竞争条件问题和/或代码中的错误,你可以在你的处理程序之外存储状态,并且它会被不同的调用共享。