Как имитировать AWS S3 getObject с помощью sinon

Я пытаюсь выполнить модульное тестирование маршрута восстановления, который возвращает объект S3 из корзины

мой маршрут:

module.exports = function(server) {
  server.get('/configs/:version', (req, res, next) => {
    const s3 = new AWS.S3();

    const params = {
      Bucket: 'testBucket',
      Key: 'testKey'
    };

    function send(data, next) {
      res.setHeader('Content-Type', 'text/plain');
      res.setHeader('Cache-Control', 'no-cache');
      res.status(200);
      res.send(data.Body);
      next();
    }

    s3.getObject(params, (err, data) => (err) ? next(err) : send(data, next));
  });
};

Для своего модульного теста я пытался издеваться над конструктором S3, чтобы я мог заглушить getObject, и терпел неудачу.

describe('#configs', () => {
  let req;
  let res;
  let next;
  let server;
  let config;
  let AWS;
  let S3;
  let route;

  beforeEach(() => {
    req = {
      params: {
        version: 'testVersion'
      }
    };

    res = {
      send: sinon.spy(),
    };

    next = sinon.spy();

    server = {
      get: sinon.stub(),
    };

    config = {
      get: sinon.stub(),
    }

    AWS = () => {
      return {
        S3: () => {
          return {
            getObject: sinon.stub()
          }
        }
      }
    }

    route = proxyquire(process.cwd() + '/lib/routes/configs/get', {
      'configs.js': config,
      'aws-sdk': AWS,
    });

    route(server);
  });

  describe('#GET', () => {
    it('Should register configs get route', () => {
      let s3 = sinon.createStubInstance(AWS.S3, {
        getObject: sinon.stub(),
      });

      server.get.callArgWith(1, req, res, next);
      expect(server.get).calledOnce.calledWith('/configs/:version');
      expect(s3.getObject).calledOnce.calledWith({
        Bucket: 'testBucket',
        Key: 'testKey'
      });
    });
  });
});

Но я получаю эту ошибку: TypeError: undefined is not a spy or a call to a spy! в методе getObject. После чтения документов sinon снова и снова я не могу понять, как издеваться над конструктором, как я могу заглушить метод getObject, чтобы я мог убедиться, что он вызывается правильно, и он возвращается, поэтому я знаю, что ответы обрабатываются правильно Может кто-нибудь помочь мне с этим?

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
2
0
3 394
1

Ответы 1

Наконец, мои макеты заработали, проблема заключалась в том, что я издевался над AWS, поскольку функция не имеет объекта, это S3, который нужно смоделировать как функцию, потому что это S3, который нужно создать. Вот как должен выглядеть макет:

function S3() { 
  return s3;
}

s3 = {
  getObject: sinon.stub(),
  putObject: sinon.stub()
};

AWS = {
  config: {
    update: sinon.stub()
  },
  S3: S3
};

Таким образом, если нужно имитировать putObject, ему просто нужно, например, сделать это: s3.putObject.callsArgWith (1, ошибка, данные);

Я пробовал приведенный выше код, но он не работает. Вы можете вкратце привести пример?

Ramkumar P 19.07.2019 12:31

Да, этот код не работает. Подправлю ответ.

fasantos 22.07.2019 11:27

TypeError: AWS.S3 не является конструктором

smartworld-dm 11.02.2020 23:58

Помните, что вы не должны создавать экземпляры в своих тестах, он уже создается в вашем коде, на самом деле вы хотите имитировать методы того же экземпляра. Но все равно этот код не отражает мое окончательное решение, я исправлю ...

fasantos 13.02.2020 10:30

Другие вопросы по теме