6
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Jestで AWS SDKモジュールをモック化する方法(promise込み)

Posted at

Jestでモック化できるケース・できないケース

普通にモック化できるケース

通常。関数やモジュールは、requireして使用していれば、モックオブジェクトを差し込むことができる。

module_a.js
module.exports = {
  featureA (paramA, ParamB) => {
    ...
  },
module.spec.js
const moduleA = require('module_a')

describe('module a test suite', () => {
  test('exist cognito user', async () => {
    moduleA.featureA = jest.fn()
  ...

モック化できないケース(AWS SDKを使用)

ここで、AWS SDKを以下のようにrequireしているとします。
ここでは、例として CognitoIdentityServiceProvider を使用しています。
わりとこのような使い方が普通かと思います。

module_a.js
const AWS = require('aws-sdk')
const cognitoidp = new AWS.CognitoIdentityServiceProvider()

module.exports = {
  featureA async (paramA, ParamB) => {
    await cognitoidp.adminGetUser(param).promise()
    ...
  },

上記で、cognitoidp.adminGetUserと、そのpromise()をモック化したいとします。
これを以下のように記述しても意図した通りになりません。

module.spec.js
const moduleA = require('module_a')

const AWS = require('aws-sdk')
const cognitoidp = new AWS.CognitoIdentityServiceProvider()

describe('module a test suite', () => {
  test('exist cognito user', async () => {
    cognitoidp.adminGetUser = jest.fn()
      ... // mockReturnValueとかを書く
  ...

モジュール側でもテスト側でも、AWS SDKのインスタンスをnewしているため、上手くモック化できません。

AWS SDKモジュールのモック化

AWS SDKのモジュールや特定のメソッドをモック化するには、
「自前で作成しているモジュールにてエクスポートし、テスト側でそれを利用する」
という方法をとる。

module_a.js
const AWS = require('aws-sdk')
const cognitoidp = new AWS.CognitoIdentityServiceProvider()

module.exports = {
  cognitoidp,
  featureA async (paramA, ParamB) => {
    await cognitoidp.adminGetUser(param).promise()
    ...
  },

テスト側からは、上記モジュールをrequireした上で、cognitoidpの中で必要なメソッドに jest.fn()を差し込む。
cognitoidp.adminGetUser をモック化する例を記載する。
本記事では、AWS SDKをpromise込みでコールしている。
このため、moduleA.cognitoidp.adminGetUserのモック化と、返却オブジェクトのメソッドであるpromiseのモック化をそれぞれ行なっている。
async/awaitを使用する場合は以下のようにする必要があるはず。

module.spec.js
const moduleA = require('module_a')

test('exist cognito user', async () => {
    moduleA.cognitoidp.adminGetUser = jest.fn()
      .mockReturnValue({
        promise: jest.fn()
          .mockResolvedValue({
            UserAttributes: [
              {
                attr: "value"
              }
            ]
          })
      })
  ...
6
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?