Jest / Стамбул покрытие для модуля, который не загружен требуют - PullRequest
0 голосов
/ 17 сентября 2018

Существует модуль foo, который содержит строки, которые нельзя проверить, когда он загружен как модуль Node.js:

if (typeof module !== 'object') {
  do.something(); // line shows as uncovered
}
...

Обычно эту строку нельзя проверить с помощью require('./foo'), поскольку module всегдаправда и не может быть смоделирована вне модуля без подключения к загрузчику модулей Node.

Поэтому я должен оценить его без require, чтобы иметь полный контроль над локальными переменными модуля:

const fooSource = fs.readFileSync(fooPath);
new Function('module', fooSource)();
expect(do.something).toHaveBeenCalled();

Этоработает, но этот тест игнорируется тестовым покрытием.

Насколько я понимаю, покрытие кода Jest (Стамбул) подключается к загрузчику модуля Node.js и украшает тело модуля инструкциями покрытия, например:

if (typeof module !== 'object') {
  cov_v50bukkd.f[2]++;
  do.something(); // shows as uncovered
}

Как можно включить покрытие для этой линии?

Я бы предпочел не просто отмечать foo со 100% покрытием, а сделать его реальным покрытием, если это возможно, как, например, оформление fooSource с инструкциями покрытия вручную.

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

1 Ответ

0 голосов
/ 17 сентября 2018

В таких случаях вы можете явно установить NODE_ENV=test для своего набора тестирования. Jest автоматически устанавливает NODE_ENV в качестве такового, поэтому вы можете использовать покрытие кода следующим образом:

if (typeof module !== 'object' || process.NODE_ENV === 'test') {
  do.something(); // line shows as uncovered
}
...