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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 19:50:26