Можно ли генерировать тесты в Jest один за другим, динамически?

Доброго вечера.
Есть jest, puppeteer и связующее звено в виде jest-puppeteer. Есть список урлов (неск. десятков), которые хочется тестировать на http статус, чтобы был 200 ок. Для этого написал нужный код, который на лету генерирует для каждого урла утверждение (it). Это работает, но плохо. Приведу сразу код.
spoiler
const assertStatus = require('./status');

// cards.js
// Это тест, вызывается в index.js так: assertions.cards({ ... });
// jest настроен обрабатывать только один файл, т.е. пишу jest /tests/index.js
module.exports = cards => {
  const cardsGenerator = generateCards();
  
  describe('all cards should have 200 ok and adding to basket', () => {
    jest.setTimeout(50000);

    generateTests(cardsGenerator);
  });

  // Генерирует тесты, рекурсивно
  function generateTests(generator) {
    const generated = generator.next();

    if(generated.done) {
      return false;
    }

    const card = generated.value;
    const testTitle = `card with type '${card.type}' and url '${card.url}' should have 200 ok`;

    assertStatus(card.url, 200, testTitle);

    generateTests(generator);
  };

  // Просто генератор, который обходит массив карточек и отдает одну за другой
  function* generateCards() {
    for(const card of cards) {
      if(!card.type || !card.urls) {
        continue;
      }

      for(const urlIndex in card.urls) {
        const url = card.urls[urlIndex];
        yield {
          type: card.type,
          url,
        };
      }
    }

    return null;
  }
};

// assertions/status.js
const actions = require('../actions');

module.exports = (url, status = 200, testTitle = null) => {
  if(!testTitle) {
    testTitle = `url '${url}' should have status ${status}`;
  }

  return describe('assert.status', () => {
    let lastResponse;
    let page;

    beforeAll(async () => {
      page = await browser.newPage();
      await page.setRequestInterception(true);

      // Это просто для того, чтобы ускорить загрузку страницы, разрешаем только document реквесты
      page.on('request', async request => actions.denyAllExceptDocument()(request));

      [lastResponse] = await Promise.all([
        page.goto(url, {
          waitUntil: 'load',
        }),
      ]);
    });

    it(testTitle, async () => {
      await expect(lastResponse.status()).toEqual(status);
    });
  });
};

Проблемы следующие:
Во-первых, это все обрабатывается jest'ом пачкой и сразу. То есть, цикл проходит, и джест начинает обрабатывать все утверждения как одно - долго думает, а потом сразу выплевывает результат всех утверждений, или ошибки.
Во-вторых, это жрет много памяти и просто неудобно - ты не видишь, какое утверждение (it) сейчас проверяется.

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

Если бы в доках джеста был какой-нибудь колбэк, который вызывался бы только после выполнения утверждения (it), я бы смог сгенерить новый тест в этом колбэке, но в доках такого нет.

Как быть, что делать?
Заранее спасибо.
  • Вопрос задан
  • 93 просмотра
Пригласить эксперта
Ответы на вопрос 1
@grinat
Ну дак генерь файлы перед запуском тестом https://nodejs.org/api/fs.html И все будешь видеть, перед запуском удаляешь старые, генеришь новые, затем запускаешь говнест.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы