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

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.")
    })
  }

错误原因

  1. 测试代码逻辑不匹配:测试中模拟$.ajax时,试图调用配置对象的e.success()方法,但实际业务代码里并没有在$.ajax的配置中定义success回调,而是用jQuery Deferred的.done()链式方法处理成功响应,因此配置对象e上不存在success函数,调用时触发报错。
  2. 业务代码语法问题:
    • 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 23:55:23