如何存根函数返回对象以处理其后续方法调用——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
相关产品推荐
相关产品推荐

