如何存根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 }; 

我如何编写上面的代码示例的unit testing。

 //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'); 

什么将是一个很好的方式来存根aws-sdk api。 我正在考虑使用SinonJS来实现它,但我向其他图书馆和build议敞开大门 。

我们创build了一个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'); }); 

然后通过调用来恢复testing后的方法:

 AWS.restore('DynamoDB', 'getItem'); 

或者还原他们所有的电话:

 AWS.restore(); 

我目前的解决scheme是暴露sample.js中的函数,如下所示。

 function overRide(data) { dynamoDB = data.dynamoDB; } if(process.env.NODE_ENV === 'test') { exports.overRide = overRide; } 

现在在我的testing案例中,我可以做以下将存根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});