sinon stub withArgs可以匹配一些但不是所有参数

时间:2014-10-18 17:58:52

标签: sinon

我有一个函数我正在使用多个参数调用它。我想检查只是第一个参数。剩下的就是回调功能,所以我想让他们独自一人。因此,我可能会使用ajax作为示例进行以下2次调用:

method.get = sinon.stub();
method.get(25,function(){/* success callback */},function(){/* error callback */});         
method.get(10,function(){/* success callback */},function(){/* error callback */});

我无法使用method.get.calls...因为它没有区分第一个get(25)和第二个get(10)。但是,如果我使用method.get.withArgs(25).calls...,那么它也不匹配,因为withArgs()匹配所有参数,而这不是(并且永远不会,与回调类似)。

我如何根据第一个arg来检查和设置响应的sinon存根?

4 个答案:

答案 0 :(得分:88)

https://sinonjs.org/releases/latest/matchers/#sinonmatchany

您可以使用sinon.match.any:

method.get.withArgs(25, sinon.match.any, sinon.match.any); 

答案 1 :(得分:1)

如果您只想查看第一个参数,可以使用

method.get.withArgs(25).calledOnce

method.get.calledWith(25)

答案 2 :(得分:1)

如果您只想检查许多

中的一个参数,这种方法对间谍非常有效
it('should check only first argument', function ():void {
            myFunction('foo', 'bar', baz');
            expect(myFunctionSpy.firstCall.args[0]).to.equal('foo');
        });

但是我不明白为什么你在这里使用存根。如果你只想检查函数的调用方式,你应该使用间谍。如果你想检查它的调用方式并改变它的行为(例如:阻止ajax调用),那么你应该使用mock。

Sinon嘲笑有自己的检查方式。我知道你的情况的唯一方法是使用sinon.match.many作为你不想检查的参数:

it('should check only first argument', async function (): Promise<void> {
                mock.expects('myFunction').withExactArgs('foo', sinon.match.any, sinon.match.any).returns('foo');
                await myFunction('foo', 'bar', baz');
                mock.verify();
            });

mock.verify()将继续测试并重置模拟以进行其他测试,如果使用间谍或存根,您应该在每次测试后使用restore()或reset()进行操作

PD:对于这里的TypeScript语法感到抱歉:p

答案 3 :(得分:1)

解决方案

withArgs 可以用于匹配某些但不是全部参数。

具体地说,method.get.withArgs(25) 检查只是第一个参数


更正

这是不正确的:

  

withArgs()所有参数匹配


详细信息

调用withArgs时,它会记住作为matchingArguments传递给here的参数。

然后,当调用stub时,它会得到所有匹配的伪造品here

matchingFakes的调用没有第二个参数,因此它返回所有具有matchingArguments that match the arguments passed to the stub starting at index 0 up to the length of matchingArguments的伪造品。这意味着,伪造品的matchingArguments与传递给参数的开头匹配时,即会匹配,即使还有其他参数

那么,任何匹配的伪造品就是sorted by matchingArguments.length,而匹配最多的参数就是invoked


以下测试确认了此行为,并通过了7年前的sinon版本1.1.0,问该问题时的版本1.14.0和当前版本{{1} }:

6.3.5