如何调用sinon存根yield一个函数取决于参数

时间:2017-02-16 04:27:24

标签: javascript unit-testing sinon

我正在使用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'})无效。

2 个答案:

答案 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)

您可以将withArgssinon.match一起使用。 例如:

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