Попытка смоделировать ответное тело из выборки для юнит-теста - PullRequest
3 голосов
/ 21 октября 2019

Я довольно новичок в Sinon и Proxyquire, и я думаю, что я прочитал все ответы здесь на SO, но я все еще не понимаю, что мне нужно. Как бы то ни было, вот обеззараженная версия моего кода.

const fetch = require('node-fetch');

async function deleteID(id, endpoint) {
  try {
      let url = `${endpoint}/delete/${id}`;
      let res = await fetch(url, { method: 'DELETE' });
      res = await res.json(); // <---- THIS FAILS WHEN fetch IS MOCKED
      // do stuff with res
  } catch (err) {
    logger.error(`Error: ${JSON.stringify(err)}`);
  }
}

Это довольно просто, он использует выборку узлов для перехода по URL-адресу, а затем выполняет какие-то действия, если запрос выполняется или не выполняется. Вот мой тест, давайте настроим макет для fetch:

const proxyquire = require('proxyquire').noCallThru();
const sinon = require('sinon');

  beforeEach((done) => {

    const validResponse = {
      status: 200,
      data: 'hello, world\n'
    };
    deleteProxy = proxyquire('./delete', {
      'node-fetch': sinon.stub().returns(Promise.resolve(JSON.stringify(validResponse)))
    });
  });

Таким образом, вызов fetch теперь возвращает validResponse вместо попадания на сервер. И вот мой тест:

    it.only('should delete', async () => {
    try {
      deleteProxy.deleteID('id', 'endpoint');
    } catch (err) {
      expect(err.message).to.have.lengthOf.at.least(0);
    }
  });

Это не удалось, так как res - это просто объект с состоянием и данными, это не правильный ответ с телом и т. Д. В остальной части нашего кода используется node-mocks-http , но все тесты, использующие этот модуль, обращаются к URL напрямую, а не косвенно, через fetch, как я делаю выше.

Как мне создать псевдоним? Ответ, чтобы соответствовать приведенному выше тесту, или я должен использовать другой подход?

1 Ответ

1 голос
/ 31 октября 2019

Глядя на код и мой опыт работы с sinon, я бы сказал, что это не фактический HTTP-ответ, поэтому вам также нужно высмеивать json(). В beforeEach методе:

 const body = {
  status: 200,
  data: 'hello, world\n'
};
var validResponse = { json: () => { return body } };
deleteProxy = proxyquire('./delete', {
  'node-fetch': sinon.stub().returns(Promise.resolve(validResponse))
});

попробуйте без JSON.stringify()

Дайте мне знать, если это не сработает.

...