Angular Jasmine测试:如何正确Mock HttpClient的ArrayBuffer响应
解决方法
你的问题根源在于TypeScript因options为any类型,错误推断HttpClient.get返回Observable<ArrayBuffer>,但实际运行时Angular会自动将服务器返回的JSON响应解析为对象。测试中返回Buffer对象导致组件无法直接访问字段,可通过以下方式解决:
方法1:直接返回解析后的对象(最简单高效)
修改测试中的spy返回值,直接返回包含目标字段的对象,用类型断言绕过编译器的类型检查:
fakeServ.getUser.and.returnValue(of({ userName: "TESTUSER" }) as Observable<ArrayBuffer>);
或者添加// @ts-ignore忽略类型错误:
// @ts-ignore fakeServ.getUser.and.returnValue(of({ userName: "TESTUSER" }));
这样组件订阅后能直接访问result.userName,测试即可通过。
方法2:模拟Angular的响应解析逻辑(贴近真实运行场景)
若需严格模拟ArrayBuffer转对象的过程,可先将JSON字符串转为ArrayBuffer,再手动解析后返回(但实际运行中Angular已自动完成此步骤,组件代码未手动处理,因此此方法仅用于特殊场景):
const mockResponse = { userName: "TESTUSER" }; const jsonStr = JSON.stringify(mockResponse); const buffer = new TextEncoder().encode(jsonStr).buffer; // 转为ArrayBuffer // 模拟Angular解析:将ArrayBuffer转为对象 const parsedResponse = JSON.parse(new TextDecoder().decode(buffer)); fakeServ.getUser.and.returnValue(of(parsedResponse) as Observable<ArrayBuffer>);
不过这种方法冗余,因为组件代码未手动处理ArrayBuffer,实际运行时Angular已自动解析,因此更推荐方法1。
内容的提问来源于stack exchange,提问作者Carter Smith
相关产品推荐
相关产品推荐

