使用Sinon模拟Ajax请求时response1未定义问题求助
问题分析与解决方案
你的问题核心在于未正确触发Sinon模拟的Ajax响应,同时存在Deferred使用的细节问题,以下是具体修复步骤:
1. 手动触发Sinon Fake Server的响应
Sinon的server.respondWith仅定义请求匹配规则,不会自动执行响应。必须调用server.respond()才能让模拟的Ajax请求完成,Deferred才会被resolve,then回调才能拿到有效参数。
修正后的测试代码:
var x= { "ID":"10" } server.respondWith('GET', "someurl/x/endpoint", [ 200, { 'Content-Type': 'application/json' }, JSON.stringify(x) ]); save(data); // 关键操作:触发模拟的Ajax响应 server.respond();
2. 规范Deferred与Ajax的使用
- 若使用jQuery的Deferred,原函数中的
Deferred.when应改为$.when,避免引用错误:
$.when( app.ajax({ type: 'GET', url: 'someurl/x/endpoint', success: function (response) { console.log("response", response); // 修正拼写错误:respsonse → response if (!response.error) { y.push(response); } } }) ).then(function (response1) { console.log("Printing 1"); console.log("response1", response1); });
- 确保
app.ajax返回符合Deferred规范的对象(比如jQuery的jqXHR对象),这样$.when才能正确处理异步流程。
3. 完善测试环境的初始化与清理
为避免测试间干扰,需在测试前后正确初始化和销毁Sinon Fake Server:
var server; beforeEach(function() { server = sinon.fakeServer.create(); }); afterEach(function() { server.restore(); });
错误原因说明
Sinon Fake Server默认会暂停所有XMLHttpRequest,不调用server.respond()的话,app.ajax对应的Deferred永远不会被resolve,then回调的参数自然为undefined,后续访问其属性就会抛出TypeError。
内容的提问来源于stack exchange,提问作者Anmol Jaising
相关产品推荐
相关产品推荐

