【问题标题】:Sinon.js calledWithExactly() dynamic number of argumentsSinon.js 调用WithExactly() 动态参数数量
【发布时间】:2016-09-02 14:48:39
【问题描述】:

让我们考虑以下函数:

function MyClass(...);
MyClass.prototype.funcToTest = function() {
    var args = arguments;
    ...
}

我希望能够测试调用此函数时使用的参数。 在我的测试中,我执行以下操作:

var obj = new MyClass();
sinon.spy(obj, 'funcToTest');
var args = [5, 3, 8];
MyClass.prototype.funcToTest.apply(obj, args);
sinon.assert.calledWithExactly(obj.funcToTest, args); // Here's the problem

问题是这个断言失败了,我不确定为什么.ith?

【问题讨论】:

    标签: javascript node.js unit-testing testing sinon


    【解决方案1】:

    *请参阅我对 Vsevolod Goloviznin 回答的第二条评论。 我找到了一个解决方案,不知道它是否是最好的,但我正在创建一个新数组以使用apply 函数传递给断言,如下所示:

    var arr = [].slice.call(args, 0);
    arr.unshift(obj.funcToTest);
    sinon.assert.calledWithExactly.apply(null, arr); 
    

    【讨论】:

      【解决方案2】:

      有两个问题:

      • 你在监视obj.funcToTest,但你打电话MyClass.prototype.funcToTest。就本次测试而言,这是两件不同的事情;
      • 断言检查是否使用由数组组成的单个参数调用方法,而不是 3 个参数;

      以下是可行的方法:

      var obj = new MyClass();
      sinon.spy(obj, 'funcToTest');
      var args = [5, 3, 8];
      obj.funcToTest.apply(obj, args);
      
      sinon.assert.calledWithExactly.apply(sinon.assert, [ obj.funcToTest ].concat(args))
      

      或者使用硬编码的参数列表:

      sinon.assert.calledWithExactly(obj.funcToTest, 5, 3, 8);
      

      【讨论】:

      • 是的,我认为我应该使用 apply,我已经发布了答案。关于监视 obj.funcToTest 并调用 MyClass.prototype.funcToTest,我没有看到问题,到目前为止,我已经编写了测试,将原型中的函数存根,但我通过实例调用它,但函数是被成功监视,当我称之为 sinon 断言时,它可以正常工作
      • @Jorayen 如果你实例化并 then 存根原型,我看不出它是如何工作的。但是,它会以相反的方式工作:存根原型,然后实例化。但这不是您的示例代码所显示的内容。
      • 是的,我过度简化了我的示例。我在测试设置中实例化之前存根,但这不是我的问题,所以我什至没有提到它。
      猜你喜欢
      • 2010-10-15
      • 2015-05-31
      • 2016-02-07
      • 2014-06-18
      • 1970-01-01
      • 1970-01-01
      • 2014-05-07
      • 1970-01-01
      • 2018-03-06
      相关资源
      最近更新 更多