如何将 onCall 与 aws-sdk-mock 一起使用?

How to use onCall with aws-sdk-mock?

我想让 mock 方法对同一方法的连续调用启用不同的响应。

我发现 Sinon 有 onCall,它允许我可以像下面这样存根方法,

        let stubCall = sandbox.stub(Math, 'random');
        stubCall.onCall(0).returns(Promise.resolve(0));
        stubCall.onCall(1).returns(Promise.resolve(-1));

但我不知道如何让它在 AWS 模拟框架上工作。

        AWS.mock('CloudFormation', 'describeStacks', Promise.resolve(stackResponse));

我试过了

AWS.mock('CloudFormation', 'describeStacks', Promise.resolve(stackResponse)).onCall(0).returns(Promise.resolve(res));

let mockCall = AWS.mock('CloudFormation', 'describeStacks', Promise.resolve(res));
mockCall.onCall(0).returns(Promise.resolve(res));

两个都不行。

我找到人discuss this issue,提到因为这个aws-mock使用了sinon,它应该可以使用onCall。有人成功使用过吗?

因为我使用了 promise,所以我不知道我还能做些什么来解决 return 同一个方法被调用了多次的不同响应。

首先,设置要模拟的AWS SDK实例

const sinon = require('sinon');
const AWS_Mock = require('aws-sdk-mock');
const AWS_SDK = require('aws-sdk');

AWSMock.setSDKInstance(AWS_SDK);

配置将被调用的存根

const stub = sinon.stub();
stub.onCall(0).returns(1);
stub.onCall(1).returns(2);

模拟服务方法

确保您模拟的是方法的准确签名。

AWSMock.mock('CloudFormation', 'describeStacks', function(params, cb) {
  cb(null, stub());
});

我们的模拟方法在行动

const cf = new AWS_SDK.CloudFormation();

cf.describeStacks({}, (err, data) => {
  if(err) {
    console.err(err);
  }
  console.log(data); // 1
});

cf.describeStacks({}, (err, data) => {
  if (err) {
    console.err(err);
  }
  console.log(data); // 2
});