首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在维护延迟功能的同时,坚持$..ajax对sinon.stub的响应(使用mocha + testem)

在维护延迟功能的同时,坚持$..ajax对sinon.stub的响应(使用mocha + testem)
EN

Stack Overflow用户
提问于 2013-08-21 15:01:55
回答 1查看 8.2K关注 0票数 4

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

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

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

代码语言:javascript
复制
  stubbedAjax = sinon.stub jQuery, 'ajax'

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

(此coffeescript计算结果为以下JS:)

代码语言:javascript
复制
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)时,我得到以下错误:

代码语言:javascript
复制
Uncaught TypeError: Cannot call method 'resolve' of undefined

我不明白为什么。引用是在函数定义后创建的。setTimeout是在创建延迟对象的作用域中定义的,因此它可以访问它。将几个console.logs放在setTimeout中可以清楚地表明,延迟对象是正确创建和访问的。

有没有人知道为什么它说推迟是未定义的?或者是另一种解决方案,如何在仍然使其立即返回延迟对象的情况下对jQuery ajax响应进行存根处理?

提前谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-08-21 15:15:13

找不到代码中的错误,这个简单的小提琴显示它应该工作。

但是,有一个更容易的方式,在西农,然后顽固的$.ajax。只需使用假服务器

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18360964

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档