Sinon.js调用了WithExactly()动态数量的参数

时间:2016-09-02 14:48:40

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

让我们考虑以下功能:

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

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

2 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

有两个问题:

  • 您正在对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);