soap.createClientAsync返回方法单元测试执行失败问题咨询
报错原因
这个TypeError: client.RegisterExperimentAsync is not a function是单元测试的mock逻辑编写错误导致的,具体问题点:
soap.createClientAsync方法的mock返回值多包裹了一层无效箭头函数。业务代码中await soap.createClientAsync(flavourUrl)的预期返回值是SOAP客户端实例,但测试代码里写的.mockReturnValueOnce(() => Promise.resolve(clientResponse)),会让await执行后拿到的client是外层的箭头函数,而非你提前定义的、带RegisterExperimentAsync方法的clientResponse对象,箭头函数本身不存在该方法,因此触发报错。- 即使修复上述问题,当前mock的
RegisterExperimentAsync方法未配置返回值,后续断言逻辑无法拿到预期结果,测试依然无法通过。
修复方法
- 移除
createClientAsyncmock返回值外层多余的箭头函数包装,直接返回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
相关产品推荐
相关产品推荐

