我想让mock方法为连续调用同一方法启用不同的响应。
我发现Sinon有onCall,它允许我可以使用下面的stub方法,
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。有人成功使用它吗?
由于我使用了承诺,我不知道还能做些什么来返回相同方法的不同响应已被多次调用。
答案 0 :(得分:3)
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
});