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

带有Args的sinon stub可以匹配一些但不是所有的参数吗

史修明
2023-03-14

我有一个我正在存根的函数,它被调用多个参数。我只想检查第一个参数。其余的都是回调函数,所以我想把它们放在一边。因此,我可能有以下2个调用,以ajax为例:

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

我不能使用< code>method.get.calls...因为它不会区分第一个< code>get(25)和第二个< code>get(10)。但是如果我使用< code>method.get.withArgs(25)。打电话...那么它也不匹配,因为< code>withArgs()匹配所有参数,而this不匹配(而且永远也不可能,使用那样的回调)。

如何让sinon存根仅根据第一个参数检查和设置响应?

共有3个答案

孟跃
2023-03-14

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

method.get.withArgs(25).calledOnce

或者

method.get.calledWith(25)
阳修永
2023-03-14

withArgs可用于匹配部分但不是所有参数。

具体来说, 方法 25 将只检查第一个参数。

这是不正确的:

withArgs()匹配所有参数

当调用带有Args的时,它会记住它在此处作为matchingArguments传递的参数。

然后当调用存根时,它会在此处获取所有匹配的假货。

调用matchingFakes时不带第二个参数,因此它返回所有fake,这些fake具有matchingArguments,这些fakes与传递给 matching arguments 索引0开始,直到。这意味着即使有额外的参数,当false的matchingArguments匹配传递的参数的开头时,false也会匹配。

然后,所有匹配的fake都按matchingArguments排序。长度和匹配最多参数的参数是被调用的参数。

以下测试确认了此行为,并通过了7年前的sinonversion1.1.0、提出此问题时的版本1.14.0和当前版本6.3.5

import * as sinon from 'sinon';

test('withArgs', () => {

  const stub = sinon.stub();

  stub.withArgs(25).returns('first arg is 25!');
  stub.returns('default response');

  expect(stub(25)).toBe('first arg is 25!');  // SUCCESS
  expect(stub(25, function () { }, function () { })).toBe('first arg is 25!');  // SUCCESS
  expect(stub(10, function () { }, function () { })).toBe('default response');  // SUCCESS

});
祁奇略
2023-03-14

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

您可以使用正统:

method.get.withArgs(25, sinon.match.any, sinon.match.any); 
 类似资料:
  • 问题内容: 我有一个简单的问题。我曾尝试在许多博客中搜索有关此问题的信息,但所有站点都返回了如何快速运行功能,但我需要这种情况。 我的自定义函数是: 如何通过args将args传递给其他系统函数? 谢谢前进。 问题答案: 与(Objective-)C中类似,您不能将变量参数列表直接传递给另一个函数。您必须创建一个 (与C语言中的Swift等效)并调用一个带有参数的函数。 所以这可能是您要寻找的:

  • 我试图发出一个静音命令,我正在添加一个系统,在这个系统中,你可以出于某种原因将它们静音。机器人将回复“(用户用户名)已禁用。原因:(原因)”。对我来说,args[0]只是提到了要禁用的用户,但我不知道如何获取args[0]之后的所有内容。我试过做类似于。但这显然不起作用-我有点猜测-我转向清单4这样的参数。 但显然,这不是很有效——有人知道如何获取args[0]之后的所有参数吗?

  • 我有一个切入点,我试图用LTW。我有两个方法,我试图建议,每一个与不同的参数列表。但是,它们都有一个我想要的共同参数。 以下是我想建议的方法签名: 我本来希望参数与execution()方法相关联,但有时会出现“混淆”,给我的是IP而不是用户名。 是我不正确地使用了AspectJ,还是这是LTW中的一个bug?我运行的是AspectJ 1.6.13

  • 问题内容: 首先, 我需要使用正则表达式来匹配或或(仅是国家编号)。我需要的用户能够输入一个并没有什么之后。似乎无法正确解决。 我发现所有正则表达式都匹配 所有 十进制数字,即 像这个正则表达式 问题是,我需要一个正则表达式,因此输入只能是带/不带小数点的数字。 但是要抓住的是它也需要匹配 因此,用户可以在文本字段中输入小数。所以基本上我需要用正则表达式来匹配 到目前为止,我的模式就是上面的模式。

  • 问题内容: 首先, 我需要使用正则表达式来匹配或或(仅是国家编号)。我需要的用户能够输入一个并没有什么之后。似乎无法正确解决。 我发现所有正则表达式都匹配 所有 十进制数字,即 像这个正则表达式 问题是,我需要一个正则表达式,因此输入只能是带/不带小数点的数字。 但是要抓住的是它也需要匹配 因此,用户可以在文本字段中输入小数。所以基本上我需要用正则表达式来匹配 到目前为止,我的模式就是上面的模式。

  • 问题内容: 我想匹配所有URL,但从与该正则表达式匹配的beeing中排除图像URL:jpe?g | gif | png。 \ b(?:https?| ftp | file):// [-A-Z0-9 +&@#/%?=〜 | $!:,。;] * A-Z0-9 +&@# /%=〜 | $ 问题是带有排除项的部分不能像这样工作:(?!jpe?g | gif | png) 有人对此有解决方案吗? 例: 不