sinon.js存根 - 你可以在单个存根函数上调用多个回调吗?

问题描述 投票:9回答:2

如果我有一个带有2个回调的函数的存根,那么当调用存根函数时,如何连接sinon.js来调用两个回调?

例如 - 这里是我想要存根的函数,它将2个函数作为参数:

function stubThisThing(one, two) {
   ... one and two are functions ...
   ... contents stubbed by sinon.js ...
}

我可以使用sinon来调用其中一个参数:

stubbedThing.callsArg(0);

要么

stubbedThing.callsArg(1);

但我似乎无法让两者都被召唤。如果我尝试:

stubbedThing.callsArg(0).callsArg(1);

要么

stubbedThing.callsArg(0);
stubbedThing.callsArg(1);

然后,sinon只会称第二个论点。如果我按照其他顺序连接它,那么sinon将调用第一个arg。但是,我希望两者一个接一个地被召唤。

javascript stub sinon
2个回答
6
投票

这不是一个经典的场景,因为没有多少方法可以顺序调用两个方法,我猜这就是为什么它不受支持。但是,要保持冷静,解决方案很简单:

var subject = { 
    method: function(one, two) {} 
};

var stub = sinon.stub(subject, 'method', function(one, two) { 
    one(); 
    two(); 
});

subject.method(
    function() { console.log('callback 1'); }, 
    function() { console.log('callback 2'); });

附注:这也提供了选择是否应首先调用一个或两个的选项。


1
投票

你为什么不完全跳过sinon?

var obj = { stubMe: function(cb1, cb2) {} };
var originalMethod = obj.stubMe;

obj.stubMe = function(cv1, cb2) { 
  //Whatever logic you wish
  cb1(); 
  cb2(); 
}; 

//Do your test

obj.stubMe = originalMethod; //Restore

这样你甚至可以继续使用sinon的API,如果你愿意的话:

var stub = sinon.stub();
obj.stubMe = function(cb1, cb2) { 
  stub.apply(stub, arguments);
  //Rest of whatever logic you wanted here
};

obj.stubMe();
expect(stub.calledOnce()).to.be(true); //That would pass

你觉得怎么样?

© www.soinside.com 2019 - 2024. All rights reserved.