aws-sdk-client-mockを使ってAWS SDK for JavaScript v3をモックする

AWS SDK for JavaScript v3を含むコードベースをテストするとき、aws-sdk-client-mockが便利、という話です。
2022.02.01

AWS公式ブログでも言及されています。

使い方

clientの応答をモックしたり、client自体がspyになるので、受け取った値をあとで教えてくれたりします。

import { DynamoDBDocumentClient, GetCommand } from '@aws-sdk/lib-dynamodb';
import { mockClient } from 'aws-sdk-client-mock';

const documentMockClient = mockClient(DynamoDBDocumentClient);

beforeEach(() => {
  documentMockClient.reset();
});

test('GetCommandをモックする', async () => {
  // モックの応答
  documentMockClient.on(GetCommand).resolves({
    Item: {
      deviceId: 'test-deviceId',
      createdAt: 1643679540259,
      updatedAt: 1643679540259,
    },
  });

  // テスト対象の処理を実行する
  await myHandler();

  // 使われたGetCommandインスタンスの配列を取り出す
  const callsOfGet = documentMockClient.commandCalls(GetCommand);
  expect(callsOfGet.length).toBe(1);
  // 1回目の呼び出しの1個目の引数を取り出す
  expect(callsOfGet[0].args[0].input).toEqual({
    TableName: 'TEST_TABLE',
    Item: {
      deviceId: 'test-deviceId',
      updatedAt: expect.any(Number),
      createdAt: expect.any(Number),
    },
  });
});

AWS SDKのモックがこんなにシュッと書けたら幸せですよね!

ClientとCommandのクラスを差し替えれば他のサービスでも同じように書けます。

詳細な使い方はREADMEを参考にしてみてください。

以上でした!