我正在使用sinonjs来测试我的ajax应用程序。
sinon.stub($, 'ajax').yieldsTo('success',
{
msgtype: 'success',
state: 'loggedin'
});
我的问题是:基于AJAX中的URL我想以不同的方式发送参数。我怎样才能做到这一点?
如果$ .ajax的网址为:/login
,则“成功”的参数应为{state:'loggedin'}
如果$ .ajax的网址为:/getemail
,则“成功”的参数应为{email:'test@test.com'}
------------ EDIT --------------
我的ajax参数是 {url:'/ login',输入:“POST”,数据:request_data,成功:功能(数据){}}
ajaxStub.withArgs({url:'/login'})
无效。
答案 0 :(得分:2)
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)
中的第三个参数提供。
function fakeAjax(obj) {
if (obj.url === '/login') {
return obj.success({ state: 'loggedin' });
}
if (obj.url === '/getemail') {
return obj.success({ email: 'test@test.com' });
}
}
sinon.stub($, 'ajax', fakeAjax);
只要确保在参数符合条件时调用正确的回调。使用此方法,您甚至可以使其更具体,例如,您还可以检查它实际上是POST请求。
答案 1 :(得分:1)
您可以将withArgs
与sinon.match
一起使用。
例如:
ajaxStub = sinon.stub(jQuery, 'ajax');
ajaxStub.withArgs(sinon.match({ url: 'https://some_url'})).yieldsToAsync('success', responseData);