如何存根aws-sdk

Jos*_*hin 5 javascript node.js sinon aws-sdk

可以说我有以下内容

// file sample.js
var aws = require('aws-sdk');
var dynamoDB = new aws.DynamoDB();

exports.processData = function(){
  var data = dynamoDB.getItem(params);
  // so something with data
};
Run Code Online (Sandbox Code Playgroud)

如何为上面的代码示例编写单元测试.

//file sample_test.js
var aws = require('aws-sdk');
var sinon = require('sinon');

// the following code doesnt seem to stub the function
// the actual function is still used in sample.js
var getItemStub = sinon.stub();
aws.DynamoDB.prototype.getItem = getItemStub;

var sample = require('./sample');
Run Code Online (Sandbox Code Playgroud)

什么是存储aws-sdk api的好方法.我正在考虑使用SinonJS来实现它,但我对其他图书馆和建议开放态度.

jru*_*uts 6

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

它真的很容易使用.只需使用服务,方法和存根函数调用AWS.mock.

AWS.mock('DynamoDB', 'getItem', function(params, callback) {
    callback(null, 'success');
});
Run Code Online (Sandbox Code Playgroud)

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

AWS.restore('DynamoDB', 'getItem');
Run Code Online (Sandbox Code Playgroud)

或者恢复所有电话:

AWS.restore();
Run Code Online (Sandbox Code Playgroud)


Jos*_*hin 2

我当前的解决方案是在 example.js 中公开一个函数,如下所示。

function overRide(data) {
  dynamoDB = data.dynamoDB;
}

if(process.env.NODE_ENV === 'test') {
  exports.overRide = overRide;
}
Run Code Online (Sandbox Code Playgroud)

现在,在我的测试用例中,我可以执行以下操作,这将存根 aws api。

//file sample_test.js
var aws = require('aws-sdk');
var sinon = require('sinon');
var sample = require('./sample');

var ddb = new aws.DynamoDB();
ddb.getItem = sinon.stub();

sample.overRideAWS({dynamoDB: ddb});
Run Code Online (Sandbox Code Playgroud)