Mock code in another module

445 views Asked by At

I want to mock Amazon AWS S3 getObject

The code I want to test is the following one: Its in helper.js

var AWS = require('aws-sdk');
var s3 = new AWS.S3();

exports.get_data_and_callback = function(callback, extra){
  s3.getObject( {Bucket: SRC_BUCKET, Key: SRC_KEY},
    function (err, data) {
      if (err != null) {
        console.log("Couldn't retrieve object: " + err);
      }else{
        console.log("Loaded " + data.ContentLength + " bytes");

        callback(data, extra);
      }
  });
}

In test/helper_test.js I wrote a test that should mock the module AWS

var assert = require('assert');
var mockery = require('mockery');

describe("helper", function() {

  it('loads and returns data from S3 to a callback', function(){
    mockery.enable();

    var fakeaws = {
      S3: function(){
          return {
            getObject: function(params, callback){
            callback(null, "hello")
          }
        }
      }
    }
    mockery.registerSubstitute('aws-sdk', fakeaws);

    function replace_function(err, data){
      console.log(data);
    }

    require('../helper.js').get_data_and_callback(replace_function, null);

  });
});

When I require AWS in the Test-File test/helper_test.js like this:

aws = require('aws-sdk');
s3 = new aws.S3;
s3.getObject(replace_function)

Then my code works, it prints out hello.

BUT the execution of require('../helper.js').get_data_and_callback(replace_function, null);

Doesn't work like expected, AWS stays the same its not replaced with my fakeaws. What do I wrong? Do you maybe have other solutions to replace S3 Thanks

1

There are 1 answers

0
jruts On

We have created an aws-sdk-mock npm module which mocks out all the AWS SDK services and methods. https://github.com/dwyl/aws-sdk-mock

It's really easy to use. Just call AWS.mock with the service, method and a stub function.

AWS.mock('S3', 'getObject', function(params, callback) {
    callback(null, 'success');
});

Then restore the methods after your tests by calling:

AWS.restore('S3', 'getObject');

This works for every service and method in the as-sdk.