You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 14:07:19