はじめに
SAM で テストする際に Jest と aws-lambda-mock-context をよく使っているのですが、処理が重くなると簡単に timeout 3 秒を超えてエラーになります。
aws-lambda-mock-context では、テスト実行時に mock 用の context を流して擬似的に lambda を実行するため、template.yml のオプションが反映されません。
そして、最初私は template.yml の timeout のオプションがなぜか反映されず困っていました。
ですが、前述のように、そもそも SAM (つまり、template.yml) を通して実行されていないのだから timeout のオプションも反映されません。Jest と aws-lambda-mock-context で完結した実行なのだから、両者でオプションを設定する必要があります。
アホですね 🌝
tl; dr
1"use strict";
2const context = require("aws-lambda-mock-context");
3const app = require("../app");
4const event = require("./event");
5
6describe("タイムアウトのテスト", () => {
7 test("テスト", async () => {
8 // ここで context に timeout オプションを設定
9 let ctx = context({
10 timeout: 10,
11 });
12
13 const response = await app.lambdaHandler(event, ctx, function () {});
14 expect(response.statusCode).toBe(200);
15 });
16});
その他オプション一覧
以下は、aws-lambda-mock-context の公式より、
region
- Type: string
- Default: us-west-1
account
- Type: string
- Default: 123456789012
functionName
- Type: string
- Default: aws-lambda-mock-context
functionVersion
- Type: string
- Default: $LATEST
memoryLimitInMB
- Type: string
- Default: 128
alias
- Type: string
timeout
- Type: number
- Default: 3
おわりに
ドキュメントを読めってことですね 🔨