我有使用延迟对象的代码,该对象通过调用$.ajax立即返回。我需要为这段代码编写单元测试,所以我不想实际往返到服务器。
我可以存根jQuery并告诉存根返回我用于测试的JSON,但是这会破坏代码,因为它需要一个延迟对象,这个对象最终会用JSON响应来解析,而不是直接的JSON响应。
我的解决方案是对$.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是在创建延迟对象的作用域中定义的,因此它可以访问它。将几个console.logs放在setTimeout中可以清楚地表明,延迟对象是正确创建和访问的。
有没有人知道为什么它说推迟是未定义的?或者是另一种解决方案,如何在仍然使其立即返回延迟对象的情况下对jQuery ajax响应进行存根处理?
提前谢谢。
发布于 2013-08-21 15:15:13
找不到代码中的错误,这个简单的小提琴显示它应该工作。
但是,有一个更容易的方式,在西农,然后顽固的$.ajax。只需使用假服务器
https://stackoverflow.com/questions/18360964
复制相似问题