为何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
相关产品推荐
相关产品推荐

