我正在使用 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', type: "POST", data: request_data, success: function(data){}}
ajaxStub.withArgs({url:'/login'})
不起作用。
最佳答案
Sinon stub 具有方法 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 请求。
关于javascript - 如何根据参数调用 sinon Stub YieldsTo 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42264960/