在另一个模块中模拟代码

时间:2015-06-13 08:31:12

标签: javascript node.js amazon-s3 mocking stub

我想模仿亚马逊 AWS S3 getObject

我要测试的代码如下:它在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);
      }
  });
}

test/helper_test.js 我写了一个应该模拟模块的测试 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);

  });
});

当我在测试文件 test/helper_test.js中需要 AWS 时,这样:

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

然后我的代码工作,打印出hello

但是执行require('../helper.js').get_data_and_callback(replace_function, null);

没有像预期的那样工作, AWS 保持不变,而不是我的 fakeaws 。我错了什么?您是否有其他解决方案可以替换 S3 谢谢

1 个答案:

答案 0 :(得分:0)

我们创建了一个aws-sdk-mock npm模块,该模块可以模拟所有AWS SDK服务和方法。 https://github.com/dwyl/aws-sdk-mock

它非常易于使用。只需使用服务,方法和存根函数调用AWS.mock。

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

然后通过调用以下方法恢复测试后的方法:

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

这适用于as-sdk中的每个服务和方法。