Jestでモック化できるケース・できないケース
普通にモック化できるケース
通常。関数やモジュールは、requireして使用していれば、モックオブジェクトを差し込むことができる。
module.exports = {
featureA (paramA, ParamB) => {
...
},
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 を使用しています。
わりとこのような使い方が普通かと思います。
const AWS = require('aws-sdk')
const cognitoidp = new AWS.CognitoIdentityServiceProvider()
module.exports = {
featureA async (paramA, ParamB) => {
await cognitoidp.adminGetUser(param).promise()
...
},
上記で、cognitoidp.adminGetUserと、そのpromise()をモック化したいとします。
これを以下のように記述しても意図した通りになりません。
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のモジュールや特定のメソッドをモック化するには、
「自前で作成しているモジュールにてエクスポートし、テスト側でそれを利用する」
という方法をとる。
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を使用する場合は以下のようにする必要があるはず。
const moduleA = require('module_a')
test('exist cognito user', async () => {
moduleA.cognitoidp.adminGetUser = jest.fn()
.mockReturnValue({
promise: jest.fn()
.mockResolvedValue({
UserAttributes: [
{
attr: "value"
}
]
})
})
...