模拟另一个模块中的代码

Mock code in another module

本文关键字:代码 模块 另一个 模拟      更新时间:2023-09-26

我想嘲笑Amazon 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);
  });
});

当我在测试文件中需要 AWStest/helper_test.js如下所示:

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

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

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

没有像预期的那样工作,AWS 保持不变,它没有被我的假货取代。我做错了什么?您是否有其他解决方案来替换S3

谢谢

我们创建了一个 aws-sdk-mock npm 模块,用于模拟所有 AWS 开发工具包服务和方法。 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 中的每个服务和方法。