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

soap.createClientAsync返回方法单元测试执行失败问题咨询

报错原因

这个TypeError: client.RegisterExperimentAsync is not a function是单元测试的mock逻辑编写错误导致的,具体问题点:

  1. soap.createClientAsync方法的mock返回值多包裹了一层无效箭头函数。业务代码中await soap.createClientAsync(flavourUrl)的预期返回值是SOAP客户端实例,但测试代码里写的.mockReturnValueOnce(() => Promise.resolve(clientResponse)),会让await执行后拿到的client是外层的箭头函数,而非你提前定义的、带RegisterExperimentAsync方法的clientResponse对象,箭头函数本身不存在该方法,因此触发报错。
  2. 即使修复上述问题,当前mock的RegisterExperimentAsync方法未配置返回值,后续断言逻辑无法拿到预期结果,测试依然无法通过。
修复方法
  • 移除createClientAsync mock返回值外层多余的箭头函数包装,直接返回resolve了mock客户端实例的Promise
  • 为mock客户端的RegisterExperimentAsync方法配置符合业务逻辑的resolve返回值,返回结构和业务代码定义的类型、断言字段保持一致
  • 可以直接使用jest提供的mockResolvedValueOnce语法糖简化Promise类型的mock写法,减少手写Promise.resolve的冗余代码
  • 如果soapHelper类没有做单例导出,调用实例方法时需要先new出实例,否则也会触发方法不存在的报错
修正后的单元测试代码
describe("**** Register via soap service ****", () => {
    it("** should excecute register method **", async () => {
        const request = cloneDeep(MOCK.API_PAYLOAD);
        // 定义和业务返回结构一致的mock响应
        const mockResponse = {
            RegisterExperimentResult: AFB_MOCK_RESPONSE.API_RESPONSE
        };
        const mockClient = {
            RegisterExperimentAsync: jest.fn().mockResolvedValue(mockResponse),
        };
        // 修正createClientAsync的mock返回值,去掉多余的外层函数
        jest.spyOn<any, any>(soap, "createClientAsync").mockResolvedValueOnce(mockClient);
        const result = await new soapHelper().registerInSoap(request);
        // 对齐返回结构做断言
        expect(result).toEqual(mockResponse);
        // 可选:验证方法调用参数是否符合预期
        expect(mockClient.RegisterExperimentAsync).toHaveBeenCalledWith({ upload: request });
    });
});

内容的提问来源于stack exchange,提问作者Mohammed Hablullah

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.31 00:27:25