Javascript 如何根据参数调用函数的sinon存根Yields
我正在使用sinonjs测试我的ajax应用程序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”
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
Withsinon.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的测试代码,它会自动将它发送到你的存根。我做错了什么。我错了,一切都成功了。再次感谢。:)