Jasmine AJAX Spy报错TypeError: e.success is not a function,求排查
测试报错
TypeError: e.success is not a function 排查与修复 之前测试能正常通过,未改动Jasmine版本,但现在运行测试时出现报错:
1_catalogDOM_spec.js:518 Uncaught (in promise) TypeError: e.success is not a function
测试代码
describe("ajax return", function() { beforeEach(function() { ajaxSpy = spyOn($, "ajax") }) describe("on success", function() { beforeEach(async function() { ajaxSpy.and.callFake(function(e) { e.success({"success":true, "remove":{1:"test"},"assign_prestock":"test2"}) }) await catalogDOM.syncAvailability(null) }) it("should call", function() { ... }) }) })
catalogDOM.syncAvailability 实现代码
catalogDOM.syncAvailability: function(item_name_id) { return new Promise(function(resolve, reject) { $.ajax({ type:"POST", url: "/retrieve-options-availability", dataType:"json", contentType:"application/json", data: JSON.stringify(params) }) .done(function(response, status_string, jqxhr) { if (response["success"] == true) { resolve() } else { reject(response["message"]) } }) .fail(function(jqxhr, error_string, exception_object){ reject("Error loading availability. Refresh & try again or contact us if this persists.") }) }
错误原因
- 测试代码逻辑不匹配:测试中模拟
$.ajax时,试图调用配置对象的e.success()方法,但实际业务代码里并没有在$.ajax的配置中定义success回调,而是用jQuery Deferred的.done()链式方法处理成功响应,因此配置对象e上不存在success函数,调用时触发报错。 - 业务代码语法问题:
params变量未定义,执行JSON.stringify(params)会抛出引用错误return new Promise(...)的闭合括号缺失,导致语法不完整
修复方案
1. 修复测试代码
将模拟$.ajax的逻辑改为返回jQuery Deferred对象,通过resolve触发.done()回调,匹配业务代码的调用方式:
describe("ajax return", function() { beforeEach(function() { ajaxSpy = spyOn($, "ajax") }) describe("on success", function() { beforeEach(async function() { // 创建Deferred对象并模拟成功响应 const deferred = $.Deferred(); deferred.resolve({"success":true, "remove":{1:"test"},"assign_prestock":"test2"}); ajaxSpy.and.returnValue(deferred); await catalogDOM.syncAvailability(null) }) it("should call", function() { ... }) }) })
2. 修复业务代码
补全缺失的括号,定义params变量(根据实际业务逻辑赋值):
catalogDOM.syncAvailability: function(item_name_id) { // 根据实际需求定义params参数 const params = { item_name_id: item_name_id }; return new Promise(function(resolve, reject) { $.ajax({ type:"POST", url: "/retrieve-options-availability", dataType:"json", contentType:"application/json", data: JSON.stringify(params) }) .done(function(response, status_string, jqxhr) { if (response["success"] == true) { resolve() } else { reject(response["message"]) } }) .fail(function(jqxhr, error_string, exception_object){ reject("Error loading availability. Refresh & try again or contact us if this persists.") }) }) // 补全Promise的闭合括号 }
内容的提问来源于stack exchange,提问作者james
相关产品推荐
相关产品推荐

