我想模仿亚马逊 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 谢谢
答案 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中的每个服务和方法。