Как использовать onCall с aws-sdk-mock? - PullRequest
0 голосов
/ 04 июня 2018

Я бы хотел, чтобы метод 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));

оба они не работали.

Я обнаружил, что люди обсуждают эту проблему , упомянутое, так как это aws-mock использует sinon, он должен иметь возможность использовать onCall.Кто-нибудь использует это успешно?

Поскольку я использую обещание, я не знаю, что еще я могу сделать, чтобы вернуть разные ответы для одного и того же метода, который был вызван несколько раз.

1 Ответ

0 голосов
/ 05 июня 2018

Во-первых, установите экземпляр 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());
});

Наш метод Mocked в действии

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
});
...