Since AWS released support for Node v8.10 in Lambda, I was able to refactor Lambda API to use
async/await instead of Bluebird promises. The code is not only much cleaner now, but I was able to remove a lot of unnecessary overhead as well. As part of the refactoring, I decided to use AWS-SDK’s native promise implementation by appending
.promise() to the end of an S3
getObject call. This works perfectly in production and the code is super compact and simple:
let data = await S3.getObject(params).promise()
The issue came with stubbing the call using Sinon.js. With the old promise method, I was using
promisifyAll() to wrap
new AWS.S3() and then stubbing the
getObjectAsync method. If you’re not familiar with stubbing AWS services, read my post: How To: Stub AWS Services in Lambda Functions using Serverless, Sinon.JS and Promises.
I know the title is a quite a mouthful, but if you are trying to run tests on your Lambda functions that interact with AWS Services using the
aws-sdk node module, then you’ve probably run into an issue stubbing or mocking the requests. In this post we’ll learn how to stub different AWS Services with Sinon.JS so that you can properly test your scripts.
UPDATE: AWS Lambda now supports Node v8.10, so we can use
async/await instead of promises. The examples below still work with either v6.10 or v8.10, however, I recommend switching to
async/await as they are more compact than promises. Read my post How To: Stub “.promise()” in AWS-SDK Node.js to learn how to deal with the
.promise() method on aws-sdk services.
Let’s say you have a Lambda function that interacts with AWS’s SQS (Simple Queue Service). v6.10 of Node doesn’t support
async/await, so you will most likely use promises if you don’t want to transpile your code or deal with callback hell. This means you need to Promisify an instance of the AWS SQS service. This is easy enough with:
const AWS = require('aws-sdk') // AWS SDK
const Promise = require('bluebird') // Promise library
const SQS = Promise.promisifyAll(new AWS.SQS())