当前位置: 首页 > 知识库问答 >
问题:

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

昌勇锐
2023-03-14

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

例如,这里有一个我想存根的函数,它接受两个函数作为参数:

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将调用第一个参数。然而,我希望两者都被一个接一个地称呼。

共有2个答案

晋俊贤
2023-03-14

你为什么不完全跳过罪恶?

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

这样,如果您愿意,您甚至可以继续使用兴农的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

你觉得怎么样?

易烨磊
2023-03-14

这不是一个典型的场景,因为没有多少方法会按顺序调用两个方法,我想这就是为什么它不受支持。但是,冷静一点,解决方案很简单:

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'); });

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

 类似资料:
  • 我有以下要测试的对象: 这是我的测试: 我正在覆盖特定参数的匹配器。我正在存根方法,以便它为特定参数返回一个值,否则抛出一个IOException,该IOException由MyObject处理。读取文件。 奇怪的是,第二个存根()在第一个存根()中抛出IOException集。我通过在第一个存根中抛出不同的异常来验证这一点。 有人能解释一下为什么在添加其他存根时会引发异常吗?我认为创建存根不会调

  • 问题内容: 我正在尝试使用sinon.js存根方法,但是出现以下错误: 这是我的代码: 这是上述代码的jsFiddle(http://jsfiddle.net/pebreo/wyg5f/5/),还有我提到的SO问题的jsFiddle(http://jsfiddle.net/pebreo/9mK5d/1/)。 我确保在ssfiddle甚至jQuery 1.9 的 外部资源 中都包含了sinon 。我

  • 我试图用Mocha、Chai和Sinon为我的代码添加更多的测试,但是我很难理解为什么第二个存根函数没有被识别为被调用。 我有一个向用户发送电子邮件的功能(稍后我将测试电子邮件功能-现在我只想处理我控制的存根依赖项) 和测试文件: 我可以用Sinon存根User.findOne()方法,但是当我尝试存根emailLogger.log()方法时,我遇到了麻烦。它似乎调用了存根,而不是真正的方法,而是

  • 因此,在重构我的基于类的聊天机器人组件以使用反应钩子的过程中,我遇到了一个使用状态钩子覆盖状态中的对象的问题。这导致只有机器人响应显示在用户界面中。当我与机器人聊天时,用户界面中显示的用户输入的闪光会被聊天机器人的响应覆盖。下面是代码: 可以这样在同一个异步函数中写入useState两次吗?如果不是,您建议我如何重构此代码,以便消息状态返回一个交替对象数组,例如:

  • 问题内容: 我正在为node.js代码编写一些单元测试,并且使用Sinon通过以下方式存根函数调用 该是这样的 对于诸如这样的用例,模拟显然可以工作,但是我想知道如何在使用时在anotherF()内部模拟myFunction()调用? 问题答案: 您可以稍微重构一下模块。像这样。

  • 问题内容: 我试图监视一个对象,并且想在构造函数调用它之前对构造函数调用的方法进行存根。 我的课看起来像这样: 不能调用setup方法。好吧,我如何监视这种方法(以及存根设置,使其什么也不做)? 模拟方法可以很好地工作,但是我想进行单元测试,因此我将需要其他方法。 之所以需要对设置方法进行打桩以使其无能为力的原因: 我正在对Lego机器人(lejos)进行编程,并在设置中放入了一些代码,该代码需要