概要

Lambdaのテストを書いているとき、DynamoDBに障害が発生したケースをMock化したい時がしばしばあります。AWSSDKのMock化方法は色々とありますが、今回はAWSSDKとJestを使用したシンプルなMock作成方法を紹介します。

ソースコード

const lambdaFunction = require("../../src/functions/ExampleFunctions")

test('異常系 : DynamoDB通信障害', () => {
      jest
        .spyOn(AWS.DynamoDB.DocumentClient.prototype, 'put')
        .mockImplementationOnce((request) => {
          throw new Error('DynamoDB Error');
        });
      const context = {};
      const callback = jest.fn();
      const event = {} // 正常系のパラメーターを設定
      // DynamoDB通信障害時はThrowされることをテスト
      await expect(
        lambdaFunction.handler(immediateEvent, context, callback)
      ).rejects.toThrow();
})

応用

上記を応用すると色々な検証を行うことが可能です。

...
test('異常系 : DynamoDB通信障害', () => {
      let callDynamoPutOperations = []
      jest
        .spyOn(AWS.DynamoDB.DocumentClient.prototype, 'put')
        .mockImplementationOnce((request) => {
          // PUTのリクエストパラメーターを格納しておく
          callDynamoPutOperations.push(request)
          throw new Error('DynamoDB Error');
        });
      const context = {};
      const callback = jest.fn();
      const event = {} 
      await expect(
        lambdaFunction.handler(immediateEvent, context, callback)
      ).rejects.toThrow();
      // 初回のPUTで失敗した場合は後続のPUTは実行されないことを検証
      expect(_.size(callDynamoPutOperations)).toBe(1)
})

まとめ

本記事を応用するとCognitoやその他のSDKの振る舞いをMock化することが可能です。Mock化覚えてAWSLambdaの開発スキルを上げましょう。(私はFargateにデプロイ想定のソースコードに対しも本記事の方法を利用することが多いです)

開発サービスの紹介

https://www.ragate.co.jp/service/aws_solutions/