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

如何存根函数返回对象以处理其后续方法调用——TypeScript中AWS.ChainableTemporaryCredentials的getPromise存根问题

问题原因

你遇到的问题本质是JSON序列化/反序列化只会保留对象的原始数据属性,而ChainableTemporaryCredentials类的getPromise()是定义在类原型上的方法——当你用JSON.parse生成对象时,这个对象只是一个普通的JS对象,完全没有继承ChainableTemporaryCredentials的原型链,自然找不到getPromise()方法。

解决方案

这里有几种实用的解决思路,你可以根据测试场景选择:

1. 创建真实类实例并覆盖测试数据

先创建一个ChainableTemporaryCredentials的真实实例,再把你序列化得到的测试数据覆盖进去——这样实例既保留了原型上的方法,又拥有你需要的测试数据:

// 先创建实例(构造参数填测试用的占位值即可)
const credentialsStub = new AWS.ChainableTemporaryCredentials({
  roleArn: "test-role" // 示例参数,根据构造函数要求填写
});
// 解析你保存的测试数据并覆盖到实例上
const testData = JSON.parse(`actual value replaced`);
Object.assign(credentialsStub, testData);

// 存根 getCredentials 方法返回这个实例
const sinonStub = sinon.stub(awsIAM, 'getCredentials');
sinonStub.resolves(credentialsStub);

2. 手动给反序列化对象添加方法存根

如果不想创建真实实例,可以直接给JSON.parse生成的对象添加getPromise的存根方法,强制让它符合类型要求:

// 解析测试数据,先声明为 Partial 类型绕过类型检查
const credentialsStub = JSON.parse(`actual value replaced`) as Partial<AWS.ChainableTemporaryCredentials>;
// 给对象添加 getPromise 的 sinon 存根,并指定返回值
credentialsStub.getPromise = sinon.stub().resolves(/* 这里填你希望 getPromise 返回的结果,比如凭证数据 */);

// 存根 getCredentials 方法,类型断言为完整类型
const sinonStub = sinon.stub(awsIAM, 'getCredentials');
sinonStub.resolves(credentialsStub as AWS.ChainableTemporaryCredentials);

3. 用Sinon的createStubInstance生成模拟实例

Sinon提供了createStubInstance工具,可以直接生成类的模拟实例,所有类方法都会自动变成Sinon存根,你还可以按需配置返回值,同时覆盖测试数据:

// 生成 ChainableTemporaryCredentials 的模拟实例,所有方法都是 sinon 存根
const credentialsStub = sinon.createStubInstance(AWS.ChainableTemporaryCredentials);
// 覆盖测试数据到实例上
const testData = JSON.parse(`actual value replaced`);
Object.assign(credentialsStub, testData);
// 配置 getPromise 的返回值(如果需要的话)
credentialsStub.getPromise.resolves(/* 测试预期的返回结果 */);

// 存根 getCredentials 方法返回模拟实例
const sinonStub = sinon.stub(awsIAM, 'getCredentials');
sinonStub.resolves(credentialsStub);

总结

这三种方法的核心都是让存根对象拥有getPromise()方法——要么通过类实例继承原型,要么手动添加方法,要么用Sinon的模拟工具生成带存根方法的实例。其中第三种方式最适合单元测试,因为它能让你轻松断言getPromise()的调用情况,比如检查它是否被调用过、调用次数等。

内容的提问来源于stack exchange,提问作者Sabo Boz

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 14:43:15