【问题标题】:Stub a Function with Callback使用回调存根函数
【发布时间】:2015-09-23 08:05:12
【问题描述】:

通常我使用这个代码:

  aws_stub.S3 = function(){};
  var fake_aws_listObjects = function(params, func){func("failure", null)};
  var fake_aws_listObjects_stub = sinon.spy(fake_aws_listObjects);
  aws_stub.S3.prototype.listObjects = fake_aws_listObjects_stub;

要存根类似以下的函数:

new AWS.S3().listObjects(that.build_params(), function(err, data) {
  if(err){
    that.make_failure_callback();
  }
  else{
    that.add_keys(data);

    if(data.IsTruncated){
      that.make_request(data.NextMarker);
    }else{
      that.make_success_callback(that.keys);
    }
  }
});

这个存根的问题在于每个请求返回相同的

现在我想做的是为每个调用设置不同的存根:

  aws_stub.S3 = function(){};
  var fake_aws_truncated = function(params, func){func(null, {
    Contents: [{Key: "3fb252ba-0724-438c-93b6-8cd0fd972a8e/image/1:::2.jpg"}],
    IsTruncated: true,
    NextMarker: "nextMarker"
    })};
  var fake_aws_listObjects = function(params, func){func(null, {Contents: [{
    Key: "3fb252ba-0724-438c-93b6-8cd0fd972a8e/image/2:::3.jpg"
  }]})};

  var fake_aws_listObjects_stub = sinon.stub();
     fake_aws_listObjects_stub.onCall(0).returns(fake_aws_truncated);
      fake_aws_listObjects_stub.onCall(1).returns(fake_aws_listObjects);

  aws_stub.S3.prototype.listObjects = fake_aws_listObjects_stub;

问题好像是returns,它没有执行函数!!

我也不能这样写:

fake_aws_listObjects_stub.onCall(0) = fake_aws_truncated;

因为这将是错误的分配!

我需要改变什么?以下是 sinon 文档:http://sinonjs.org/docs/

谢谢!!

【问题讨论】:

  • 这是一个非常混乱的代码,可以尝试使用。在发布之前,简单地对其基本部分进行编码,删除任何上下文通常是有意义的。比如,Amazon S3 与这个问题有什么关系?没有。与您的实际问题相比,问题标题具有误导性。

标签: javascript sinon stubbing


【解决方案1】:

我可能会换一种方式。

如果你想存根AWS.S3.prototype.listObjects,我会这样做:

var stub = sinon.stub(AWS.S3.prototype, 'listObjects');

要使用各种值调用回调,请使用stub.yields()

stub.onCall(0).yields(null, {
  Contents    : [{Key: "3fb252ba-0724-438c-93b6-8cd0fd972a8e/image/1:::2.jpg"}],
  IsTruncated : true,
  NextMarker  : "nextMarker"
});

stub.onCall(1).yields(null, {
  Contents : [{Key: "3fb252ba-0724-438c-93b6-8cd0fd972a8e/image/2:::3.jpg"}]
});

要测试您的代码,您只需像以前一样调用listObjects

var s3 = new AWS.S3();
s3.listObjects(params, function(err, value) {
  ...`value` is now one of the fixtures you declared above...
});

要恢复到方法的原始版本,请使用以下方法之一:

stub.restore();
// OR:
AWS.S3.prototype.listObjects.restore();

【讨论】:

  • 太棒了!谢谢!在我与yields 也有类似的事情之前,对我来说没有成功!非常感谢!
猜你喜欢
  • 1970-01-01
  • 2015-07-01
  • 2023-03-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-28
相关资源
最近更新 更多