ser*_*g10 9 javascript stub sinon
如果我有一个带有2个回调的函数的存根,那么当调用存根函数时,如何连接sinon.js来调用两个回调?
例如 - 这里是我想要存根的函数,它将2个函数作为参数:
function stubThisThing(one, two) {
... one and two are functions ...
... contents stubbed by sinon.js ...
}
Run Code Online (Sandbox Code Playgroud)
我可以使用sinon来调用其中一个参数:
stubbedThing.callsArg(0);
Run Code Online (Sandbox Code Playgroud)
要么
stubbedThing.callsArg(1);
Run Code Online (Sandbox Code Playgroud)
但我似乎无法让两者都被召唤.如果我尝试:
stubbedThing.callsArg(0).callsArg(1);
Run Code Online (Sandbox Code Playgroud)
要么
stubbedThing.callsArg(0);
stubbedThing.callsArg(1);
Run Code Online (Sandbox Code Playgroud)
然后,sinon只会称第二个论点.如果我按照其他顺序连接它,那么sinon将调用第一个arg.但是,我希望两者一个接一个地被召唤.
这不是一个经典的场景,因为没有多少方法可以顺序调用两个方法,我猜这就是为什么它不受支持.但是,要保持冷静,解决方案很简单:
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'); });
Run Code Online (Sandbox Code Playgroud)
附注:这也提供了选择是否应首先调用一个或两个的选项.
你为什么不完全跳过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
Run Code Online (Sandbox Code Playgroud)
这样,如果您愿意,您甚至可以继续使用 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
Run Code Online (Sandbox Code Playgroud)
你觉得怎么样?
| 归档时间: |
|
| 查看次数: |
2036 次 |
| 最近记录: |