Заглушка вложенной функции в Jest - PullRequest
0 голосов
/ 12 ноября 2018

У меня две функции в модуле в области видимости модуля.Одна из функций используется другой.

async function allCinemas({ puppeteer, states }) {
  const cinemaDetails = [];
  const page = await puppeteer
    .launch({
      handleSIGINT: true /*devtools: false,headless: true*/
    })
    .then(browser => browser.newPage());

  await page.setViewport({ width: 1366, height: 735 }); //form factor - laptop/PC
  await page.goto("https://www.somesite.come");

  for (const state of states) {
    const res = await cinemasfromState(page, state);
    res.forEach(cin => {
      cinemaDetails.push(cin);
    });
  }
  await page.close();

  return cinemaDetails;
}

async function cinemasfromState(page, state) {
  const CINEMA_SELECTOR = `div[$[STATE]] div.top-select-option h.element`;

  let res = await page.evaluate(
    (elementPath, state) => {
      let results = Array.from(document.querySelectorAll(elementPath)).map(
        function(cin, index) {
          let result = {
            cinemaState: this.state,
            cinemaId: cin.getAttribute("id"),
            cinemaName: cin.getAttribute("name"),
          };
          return result;
        },
        { state }
      );

      return  [...results.reduce((a, c) => a.set(c.cinemaId, c), new Map()).values()];     

    },
    CINEMA_SELECTOR.replace("$[STATE]", state),
    state
  );

  return  Promise.resolve(res);
}
export { allCinemas, cinemasfromState };

Я тестировал отдельно function cinemasfromState

Поэтому, когда я тестирую function allCinemas, я думаю о заглушении function cinemasfromState.

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

Ответы [ 2 ]

0 голосов
/ 12 ноября 2018

До тех пор, пока обе функции определены в одном и том же модуле, нет нормального способа смоделировать только одну функцию, которая затем используется другой функцией - это модуль. Может быть, становится понятно, почему, если вы думаете о порядке выполнения кода.

  1. Внутри модуля объявлены две функции A и B. Функция B имеет ссылку на функцию A.
  2. Модуль импортирован в ваш тест. На данный момент нет способа удалить ссылку на A внутри B.

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

0 голосов
/ 12 ноября 2018

Использование sinon

Во время тестирования b вы должны проверить его поведение на разных откликах от a (потоки «счастливый» и «сбой»). Так что вам нужно заглушить a с разными значениями, чтобы правильно проверить b.

import * as allMethods from './whereever-the-file-is';
import sinon from 'sinon';

// inside your test case
const aStub = sinon.stub(allMethods, 'a');

aStub.returns('x');
// test your function b on what it should do when a returns 'x'

aStub.returns('y');
// test your function b on what it should do when a returns 'y'

Я не проверял этот код, поэтому, пожалуйста, обратитесь к официальным документам , если вам нужно узнать больше о заглушках sinon.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...