TypeScript下如何用Sinon stub返回AWSError测试DynamoDB查询分支
配置方法
你需要让Sinon stub的query方法返回包含promise方法的对象,且promise方法resolve的结果符合你业务代码中判断的PromiseResult结构,包含带error字段的$response属性,完整测试代码如下:
it('With error @ query', async () => { // 构造模拟的AWSError对象,可按需填充错误字段 const mockAWSError = { code: 'InternalServerError', message: 'DynamoDB query failed', statusCode: 500, retryable: true }; // 构造符合PromiseResult结构的返回值 const mockQueryResult = { $response: { error: mockAWSError } }; // 配置stub:调用query返回带promise方法的对象,promise resolve上述模拟结果 const errorStub = Sinon.stub(AWS.DynamoDB.DocumentClient.prototype, 'query') .returns({ promise: () => Promise.resolve(mockQueryResult) }); const input: User = { Email: "pleaseneverregisteruserwiththisemail@gmail.com" }; // 注意:你的业务逻辑中查询出错时返回true,这里需要把expectedOutput修改为true const expectedOutput: boolean = true; const output = await checkIfUserExist(input); expect(output).to.equal(expectedOutput); expect(errorStub.calledOnce).true; Sinon.restore(); })
补充说明
如果你的AWS SDK默认是查询出错时promise()直接reject错误(绝大多数场景下的默认行为),你原有业务代码没有加try/catch包裹await语句会直接抛出异常导致测试失败,此时有两种处理方案:
- 修改业务代码,给查询逻辑加
try/catch,捕获错误后走对应返回逻辑 - 将stub的promise改为reject,同时在测试中捕获异常做对应断言,适配你的业务逻辑即可。
内容的提问来源于stack exchange,提问作者TheOneFromBrazil
相关产品推荐
相关产品推荐

