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

为何Jasmine测试用例中无法获取HTTP状态码与数据?

问题分析与解决

你的测试用例中then回调里的status和data都是undefined,核心是三个关键环节的参数传递出了问题,我来一步步拆解修复:

1. updateOperation没有给Promise的resolve传递任何数据

看你updateOperation里的updateSuccess方法:

updateSuccess = function () { deferred.resolve(); },

这里你既没有接收xyzService.invokeREST成功回调传来的data,也没有把任何值传给deferred.resolve()。当Promise被resolve时没有携带任何数据,then回调自然拿不到参数。

修改方式:

让updateSuccess接收参数,并把需要的数据传递给resolve。如果需要同时拿到data和status,可以用对象包装起来:

updateSuccess = function (data, status) { 
  deferred.resolve({ data: data, status: status }); 
},

2. xyzService.invokeRest的成功回调没传递status给业务层

当前你的xyzService.invokeRest的success回调只把data传给了successCB:

.success(function(data, status, headers, config) { 
  data = JSON.parse(data); 
  successCB(data); 
  return data; 
})

如果业务层需要拿到响应状态码status,得把它也传递给successCB:

.success(function(data, status, headers, config) { 
  // 注意:如果后端返回的已经是JSON格式,$http会自动解析,手动JSON.parse可能报错,建议确认后再保留
  data = JSON.parse(data); 
  successCB(data, status); // 同时传递data和status
  return data; 
})

3. 测试用例的then回调参数写法错误

AngularJS的$q Promise的then第一个回调函数只接收一个参数(就是resolve传递的完整值),你原来的写法:

taskService.updateOperation(UUID).then(function(status,data){ 
  expect(status).toEqual(200); 
});

是错误的,因为then回调的第一个参数是resolve传递的整体值,不是拆分的status和data。

修改后的测试用例:

结合前面的修改,我们传递了包含data和status的对象,测试用例要对应调整:

it("should call update & resolve promise when http response is", function() { 
  $httpBackend.expectPUT(getValidURL).respond(200, true); 
  taskService.updateOperation(UUID).then(function(result){ 
    expect(result.status).toEqual(200);
    expect(result.data).toEqual(true); 
  }); 
  $httpBackend.flush(); 
});

额外提醒:方法名拼写错误

你的业务代码里调用的是xyzService.invokeREST(大写REST),但实际实现的是xyzService.invokeRest(小写Rest),这会直接导致调用失败,一定要修正这个拼写问题!


内容的提问来源于stack exchange,提问作者Govinda Sakhare

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 06:55:27