Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/461.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何根据参数调用函数的sinon存根Yields_Javascript_Unit Testing_Sinon - Fatal编程技术网

Javascript 如何根据参数调用函数的sinon存根Yields

Javascript 如何根据参数调用函数的sinon存根Yields,javascript,unit-testing,sinon,Javascript,Unit Testing,Sinon,我正在使用sinonjs测试我的ajax应用程序 sinon.stub($, 'ajax').yieldsTo('success', { msgtype: 'success', state: 'loggedin' }); 我的问题是:基于AJAX中的URL,我希望以不同的方式发送参数。我怎样才能做到这一点 若$.ajax的url为:/login,则“success”的参数应为{state:'loggedin'} 若$.ajax的url为:/getemail,则“success”

我正在使用sinonjs测试我的ajax应用程序

sinon.stub($, 'ajax').yieldsTo('success',
{
    msgtype: 'success',
    state: 'loggedin'
});
我的问题是:基于AJAX中的URL,我希望以不同的方式发送参数。我怎样才能做到这一点

若$.ajax的url为:
/login
,则“success”的参数应为{state:'loggedin'}

若$.ajax的url为:
/getemail
,则“success”的参数应为{email:'test@test.com“}

------------编辑--------------

我的ajax参数是 {url:'/login',键入:“POST”,数据:请求_数据,成功:函数(数据){}


ajaxStub.withArgs({url:'/login'})
不起作用。

Sinon存根具有
stub.withArgs(arg1[,arg2,…])
方法,该方法允许您使用不同的输入参数为同一函数指定不同的行为。由于
$.ajax
的第一个参数是URL,因此可以执行以下操作:

const ajaxStub = sinon.stub($, 'ajax');
ajaxStub.withArgs('/login').yieldsTo('success', { state: 'loggedin' });
ajaxStub.withArgs('/getemail').yieldsTo('success', { email: 'test@test.com' });
编辑 由于要将对象作为唯一的参数传递,因此使用
withArgs()
可能不容易实现,甚至不可能实现。我想解决这个问题最简单的方法是定义一个自定义函数,用来代替
$.ajax
。幸运的是,这在JavaScript中非常简单,sinon允许您提供替换函数作为
sinon.stub(object,'method',replaceFunc)
中的第三个参数


只要确保在参数与条件匹配时调用正确的回调。使用此方法,您甚至可以使其更加具体,例如,您还可以检查它是否实际上是POST请求。

Sinon存根具有方法
存根。withArgs(arg1[,arg2,…])
,它允许您使用不同的输入参数为同一函数指定不同的行为。由于
$.ajax
的第一个参数是URL,因此可以执行以下操作:

const ajaxStub = sinon.stub($, 'ajax');
ajaxStub.withArgs('/login').yieldsTo('success', { state: 'loggedin' });
ajaxStub.withArgs('/getemail').yieldsTo('success', { email: 'test@test.com' });
编辑 由于要将对象作为唯一的参数传递,因此使用
withArgs()
可能不容易实现,甚至不可能实现。我想解决这个问题最简单的方法是定义一个自定义函数,用来代替
$.ajax
。幸运的是,这在JavaScript中非常简单,sinon允许您提供替换函数作为
sinon.stub(object,'method',replaceFunc)
中的第三个参数


只要确保在参数与条件匹配时调用正确的回调。使用此方法,您甚至可以使其更加具体,例如,您还可以检查它是否实际上是一个POST请求。

您可以使用
With args
With
sinon.match
。 例如:

ajaxStub = sinon.stub(jQuery, 'ajax');
ajaxStub.withArgs(sinon.match({ url: 'https://some_url'})).yieldsToAsync('success', responseData);

您可以将
with args
sinon.match
一起使用。 例如:

ajaxStub = sinon.stub(jQuery, 'ajax');
ajaxStub.withArgs(sinon.match({ url: 'https://some_url'})).yieldsToAsync('success', responseData);

我已经编辑了这个问题,你能检查一下我更新了答案,只为
$.ajax
.Michael,
sinon.stub($,'ajax',fakeAjax)提供了一个对象未发送到
fakeAjax
函数。我需要在这个存根上做些什么才能使它工作?在你完成存根后,你运行调用$.ajax的测试代码,它会自动将它发送到你的存根。我做错了什么。我错了,一切都成功了。再次感谢。:)我已经编辑了这个问题,你能检查一下我更新了答案,只为
$.ajax
.Michael,
sinon.stub($,'ajax',fakeAjax)提供了一个对象未发送到
fakeAjax
函数。我需要在这个存根上做些什么才能使它工作?在你完成存根后,你运行调用$.ajax的测试代码,它会自动将它发送到你的存根。我做错了什么。我错了,一切都成功了。再次感谢。:)