Mock AWS SDK for javascript / node.js in Jest

Windix Feng
Jan 15, 2019 · 2 min read

See my latest update on using ES6 destructing assignment at the end.

An example project can be found here: https://github.com/windix/jest-aws-sdk-mock


Take SSM.getParameter().promise() as an example.

Code:

const AWS = require('aws-sdk')

const ssm = new AWS.SSM()
const params = {
Name: 'NAME',
WithDecryption: true
}
const result = await ssm.getParameter(params).promise()

Test code:

const AWS = require('aws-sdk')

const ssmGetParameterPromise = jest.fn().mockReturnValue({
promise: jest.fn().mockResolvedValue({
Parameter: {
Name: 'NAME',
Type: 'SecureString',
Value: 'VALUE',
Version: 1,
LastModifiedDate: 1546551668.495,
ARN: 'arn:aws:ssm:ap-southeast-2:123:NAME'
}
})
})

AWS.SSM = jest.fn().mockImplementation(() => ({
getParameter: ssmGetParameterPromise
}))

Note: ES6 destructing assignment doesn’t work in this case (in both code and testing code). For example:

const { SSM } = require('aws-sdk')

We also use our own wrapper for AWS SDK at work. In our case, we don’t need to initialise new class with new AWS.SSM(), instead, using AWS.SSM(), but the above mock code still works.

Note that ES6 destructing assignment still doesn’t work in this case (in both code and testing code).


Update on 18/03/2019:

From my recent learning I realised ES6 destructing assignment SHOULD work! Please compare with the original code to see the differences!

Code:

const { SSM } = require('aws-sdk')const ssm = new SSM()
const params = {
Name: 'NAME',
WithDecryption: true
}
const result = await ssm.getParameter(params).promise()

Test code:

const { SSM } = require('aws-sdk')jest.mock('aws-sdk')const ssmGetParameterPromise = jest.fn().mockReturnValue({
promise: jest.fn().mockResolvedValue({
Parameter: {
Name: 'NAME',
Type: 'SecureString',
Value: 'VALUE',
Version: 1,
LastModifiedDate: 1546551668.495,
ARN: 'arn:aws:ssm:ap-southeast-2:123:NAME'
}
})
})

SSM.mockImplementation(() => ({
getParameter: ssmGetParameterPromise
}))

We need to use jest auto-mock jest.mock() which will set SSM = jest.fn() . So as long as we don’t reassign new value to SSM , instead, calling mockImplementation() on it directly and it will work perfectly.

Welcome to a place where words matter. On Medium, smart voices and original ideas take center stage - with no ads in sight. Watch
Follow all the topics you care about, and we’ll deliver the best stories for you to your homepage and inbox. Explore
Get unlimited access to the best stories on Medium — and support writers while you’re at it. Just $5/month. Upgrade