Mocking using aws-sdk-mock's promise support with DocumentClient

JAck28 picture JAck28 · Feb 24, 2017 · Viewed 30.2k times · Source

I'm trying to write a unit test using aws-sdk-mock's promise support. I'm using DocumentClient.

My code looks like this:

const docClient = new AWS.DynamoDB.DocumentClient();

const getItemPromise = docClient.get(params).promise();
   return getItemPromise.then((data) => {
   console.log('Success');
   return data;
}).catch((err) => {
   console.log(err);
});

My mock and unit test looks like this:

const AWS = require('aws-sdk-mock');
AWS.Promise = Promise.Promise;

AWS.mock('DynamoDB.DocumentClient', 'get', function (params, callback)
{
   callback(null, { Item: { Key: 'test value } });
});

dynamoStore.getItems('tableName', 'idName', 'id').then((actualResponse) => {
  // assertions
  done();
});

Runnning my unit test, does not return my test value, it actually bypasses my mock, and calls calls dynamoDb directly. What am I doing wrong? How can I get my mock set up properly?

Answer

wyu picture wyu · Apr 3, 2017

It's unclear from your code but aws-sdk-mock has this note

NB: The AWS Service needs to be initialised inside the function being tested in order for the SDK method to be mocked

so the following will not mock correctly

var AWS      = require('aws-sdk');
var sns      = AWS.SNS();
var dynamoDb = AWS.DynamoDB();

exports.handler = function(event, context) {
  // do something with the services e.g. sns.publish 
}

but this will

var AWS = require('aws-sdk');

exports.handler = function(event, context) {
  var sns      = AWS.SNS();
  var dynamoDb = AWS.DynamoDB();
  // do something with the services e.g. sns.publish 
}

see more here https://github.com/dwyl/aws-sdk-mock#how-usage