javascript - 用 sinon.stub stub $.ajax 的响应,同时保持延迟功能(使用 mocha + testem)

标签 javascript mocha.js sinon

我有使用延迟对象的代码,该对象从对 $.ajax 的调用中立即返回。我需要为此代码编写单元测试,所以我不想实际往返于服务器。

我可以 stub jQuery 并告诉 stub 返回我用于测试的 JSON,但这会破坏代码,因为它需要一个延迟对象,该对象最终通过 JSON 响应而不是直接的 JSON 响应来解析。

我的解决方案尝试是 stub $.ajax 并告诉它返回一个立即执行的函数。在这个 IEFE 中,我创建了一个新的 $.Deferred 并设置了几毫秒的超时。超时后,我用我想要的 JSON 解析 $.Deferred。代码如下所示:

  stubbedAjax = sinon.stub jQuery, 'ajax'

  stubbedAjax.returns ( ->
    deferred = jQuery.Deferred()
    setTimeout ->
      deferred.resolve(JSON.stringify(customActionResponse))
    , 10
    return deferred
  )()

(此 coffeescript 评估为以下 JS :)

var stubbedAjax;

stubbedAjax = sinon.stub(jQuery, 'ajax');

stubbedAjax.returns((function() {
  var deferred;
  deferred = jQuery.Deferred();
  setTimeout(function() {
    return deferred.resolve(JSON.stringify(customActionResponse));
  }, 10);
  return deferred;
})());

当我运行测试(使用 mocha 和 testem)时,出现以下错误:

Uncaught TypeError: Cannot call method 'resolve' of undefined

我不明白为什么。引用是在函数定义时创建的。 setTimeout 是在创建延迟对象的范围内定义的,因此它可以访问它。在 setTimeout 中放置一些 console.logs 清楚地表明延迟对象已正确创建并可访问。

有人知道为什么它说延迟是未定义的吗?或者也许是一种替代解决方案,即如何在仍然使它立即返回延迟对象的同时 stub jQuery ajax 响应?

提前致谢。

最佳答案

无法发现代码中的错误,事件如此简单 fiddle表明它应该有效。

但是在 sinon 中有一个比 stubbing $.ajax 更简单的方法。只需使用 fake server

关于javascript - 用 sinon.stub stub $.ajax 的响应,同时保持延迟功能(使用 mocha + testem),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18360964/

相关文章:

javascript - jQuery .not() 问题

node.js - GitLab-CI 和 node.js - 如何启动本地服务器然后运行测试?

javascript - Mocha 测试超时

javascript - 我可以为一系列结果制作 stub 吗? "sinon.stub().callsFake(()=>{})"断言错误 : NaN

Javascript:动态创建按钮的 onclick/onsubmit

Javascript If 语句,遍历数组

javascript - 搜索 JS 数组而不丢失索引 - 工作 Codepen 演示使用 fetch() 和 Alpine.js

javascript - Sinon.JS 错误 URL 无效,如何解决

javascript - 测试数组对象的值

javascript - Sinon,使用 Promise.reject() 到 stub.rejects() 观察不同的行为