javascript - 如何根据参数调用 sinon Stub YieldsTo 函数

标签 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”的参数应为 {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/

相关文章:

javascript - promise 是闭包吗?

javascript - addeventlistener 不能使用一个按钮多次工作

java - 单元测试无效带有随后续操作改变状态的依赖项的方法

javascript - Sinon stub 函数内的函数

javascript - 如何在测试函数中对外部模块进行 sinon stub 调用

javascript - 未调用 Angular 2 http 发布请求

javascript - 我如何在 html css 和 jquery 上创建一个响应式菜单,一个一个地隐藏 li 元素?

unit-testing - 闭包内的 mock 模拟方法

python - argparse 错误 : Option not recognized

javascript - Sinon spy 期望嵌套函数中的函数调用