Sinon存根与ExactArgs?

时间:2018-10-01 12:25:03

标签: sinon

Sinon模拟有一个带有exactArgs的方法,该方法声明传递给有问题的方法的参数数量。有没有办法使用存根实现这种行为?

现在他们似乎像这样工作:

const methodStub = stub();
methodStub.withArgs().returns(1);
console.log(methodStub()); // prints 1
console.log(methodStub({})); // also prints 1

我想要一个 exact 参数匹配。我已经研究过向sinon添加自定义行为,但没有成功。我真的不知道下一步该怎么做。

我知道在进行调用之后我可以检查参数,但是我觉得以这种方式编写的测试的整洁性没有用。

此外,这篇关于SO的相当受欢迎的帖子让我非常感到困惑:Can sinon stub withArgs match some but not all arguments。引用:

  

如果我使用method.get.withArgs(25).calls ...则也不匹配,因为withArgs()匹配所有参数

我似乎正在观察与Sinon v6完全相反的情况,这正是OP所寻找的行为...

1 个答案:

答案 0 :(得分:0)

此链接问题的陈述不正确:

  

withArgs()所有参数匹配

withArgs 与所有参数匹配。我添加了answer并提供了详细信息。


withExactArgs代表stub has been discussed but never implemented


所以,是的,当前,在调用后检查参数,将callsFake与自定义函数一起使用,添加自定义行为,或者使用mock而不是stub sinon中的选项,用于断言使用精确参数调用了一个方法。


举个例子,问题的存根看起来像它应该只返回1,如果没有参数可以使用callsFake来调用它:

test('stub exact args', () => {
  const stub = sinon.stub();
  stub.callsFake((...args) => {
    if (args.length === 0) {
      return 1;
    }
    return 'default response';
  });

  expect(stub()).toBe(1);  // SUCCESS
  expect(stub({})).toBe('default response');  // SUCCESS
});