【问题标题】:how to call sinon stub yieldsTo a function depending on arguments如何根据参数调用 sinon 存根 yieldTo 函数
【发布时间】:2017-02-16 04:27:23
【问题描述】:

我正在使用 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'}) 不工作。

【问题讨论】:

    标签: javascript unit-testing sinon


    【解决方案1】:

    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 请求。

    【讨论】:

    • 我已经编辑了问题,您可以查看stackoverflow.com/users/6447491/michael-jungo
    • 我更新了仅向$.ajax提供对象的情况的答案。
    • 迈克尔,sinon.stub($, 'ajax', fakeAjax); 没有发送到fakeAjax 函数。我需要在这个存根上做什么才能使其工作?
    • 存根后,运行调用 $.ajax 的测试代码,它应该会自动将其发送到存根。
    • 我做错了什么。我的错误,一切正常。再次感谢。 :)
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 2020-03-29
      • 1970-01-01
      • 2015-02-12
      • 1970-01-01
      • 2016-07-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-11
      相关资源
      最近更新 更多