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

Anu*_*rag 2 javascript unit-testing sinon

我正在使用 sinonjs 来测试我的 ajax 应用程序。

sinon.stub($, 'ajax').yieldsTo('success',
{
    msgtype: 'success',
    state: 'loggedin'
});
Run Code Online (Sandbox Code Playgroud)

我的问题是:基于 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'})不管用。

Mic*_*ngo 5

stub.withArgs(arg1[, arg2, ...])Sinon 存根具有允许您使用同一函数的不同输入参数指定不同行为的方法。由于第一个参数$.ajax是 URL,因此您可以执行以下操作:

const ajaxStub = sinon.stub($, 'ajax');
ajaxStub.withArgs('/login').yieldsTo('success', { state: 'loggedin' });
ajaxStub.withArgs('/getemail').yieldsTo('success', { email: 'test@test.com' });
Run Code Online (Sandbox Code Playgroud)

Edit

因为您将对象作为唯一参数传递,所以它可能不容易实现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);
Run Code Online (Sandbox Code Playgroud)

只需确保当您的参数与您的条件匹配时调用正确的回调即可。使用此方法,您甚至可以使其更具体,例如您还可以检查它是否实际上是 POST 请求。