Как издеваться над не установленным пакетом npm в jest? - PullRequest
1 голос
/ 29 марта 2019

Как смоделировать не установленный пакет npm в jest ?

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

Обновление

Моя библиотека имеет необязательную зависимость. Конечный пользователь моей библиотеки может опционально установить styled-components.

В своих тестах (шутка) я рассмотрел случай, когда установлен styled-components. Теперь мне нужно покрыть случай, когда пакет не установлен.

test(`When styled-components is not installed`, () => {
  process.env.SC_NOT_INSTALLED = true
  const fn = () => {
    const styled = require(`./styled`)
  }
  expect(fn).toThrow(Error)
})
let styled

try {
  require.resolve(`styled-components`)
  styled = require(`styled-components`)

  if (process.env.NODE_ENV === `test` && process.env.SC_NOT_INSTALLED) {
    throw new Error(`Imitation styled-components is not installed`)
  }
}
catch {
  styled = () => {
    throw new Error(`Module not found: styled-components`)
  }
}

export default styled

process.env.SC_NOT_INSTALLED -> не будет работать, потому что, как я полагаю, тест выполняется в другом процессе.

1 Ответ

1 голос
/ 30 марта 2019

Когда в вашем try генерируется исключение, вы экспортируете функцию .

Вызов экспортированной функции - это то, что выдает Error.

Измените свой тест следующим образом:

test(`When styled-components is not installed`, () => {
  process.env.SC_NOT_INSTALLED = true;
  const styled = require(`./styled`).default;
  expect(() => styled()).toThrow('Module not found: styled-components');  // Success!
});

... и он должен работать.


Обновление

Если вы вызываете require('./styled') несколько раз в одном и том же тестовом файле, вам нужно добавить afterEach, который вызывает jest.resetModules, в противном случае Jest будет кешировать модуль и просто продолжать возвращатьодин и тот же модуль для каждого require:

afterEach(() => {
  jest.resetModules();
})

test(`When styled-components is installed`, () => {
  const styled = require(`./styled`).default;
  // ...
});

test(`When styled-components is not installed`, () => {
  process.env.SC_NOT_INSTALLED = true;
  const styled = require(`./styled`).default;
  expect(() => styled()).toThrow('Module not found: styled-components');  // Success!
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...