jest.setMock не работает для установленных зависимостей - PullRequest
0 голосов
/ 28 апреля 2018

У меня проблемы с использованием jest.setMock с установленными зависимостями

Итак, у меня есть функция для тестирования, которая требует my-module зависимости:

// my-module/index.js

import { hello } from 'my-dep';
export const doSomething = () => {
  return hello();
};

// my-dep
// location: my-module/node_modules/my-dep/index.js

export const hello = () => {
  return 'dude';
};

У меня "npm связанный" my-module в моем app:

cd my-module
npm link
cd app
npm link my-module

Я написал тестовый файл следующим образом:

// app/feature.test.js

jest.setMock('my-dep', {
  hello: () => 'world'
});

const { doSomething } = require('my-module');

it('should return dude', () => {
  expect(doSomething()).toBe('dude');
});

Я не понимаю, почему насмешка my-dep не сработала и вызвала действительную функцию hello().

Когда я попытался использовать файл my-module в качестве относительной зависимости импорта & установки my-dep, сработало насмешливо:

// app/feature.test.js

jest.setMock('my-dep', {
  hello: () => 'world'
});

const { doSomething } = require('./my-module');

it('should return world', () => {
  expect(doSomething()).toBe('world');
});

Что мне здесь не хватает?

Окружающая среда:

Бинарные:

  • Узел: 8.9.4
  • Пряжа: 1.3.2
  • нпм: 5,6,0

npmPackages:

  • шутка: ^ 22.4.3 => 22.4.3

Некоторые связанные вопросы:

  1. https://github.com/facebook/jest/issues/701
  2. https://github.com/facebook/jest/issues/796

1 Ответ

0 голосов
/ 28 апреля 2018

Ваша проблема, вероятно, вызвана порядком загрузки модуля, но я не уверен, как изменение с my-module на ./my-module меняет его. Я хотел бы видеть вывод консоли после добавления console.log(require('path').join(__dirname, __filename)) к началу my-module и my-dep.

Этот комментарий в сообщенной вами проблеме Jest указывает, что jest.setMock не поднимается до ваших import заявлений. Если вы переключите его на использование jest.mock, которое поднято, это работает?

jest.mock('my-dep', () => ({
  hello: () => 'world'
}));

В документах Jest о ручных издевательствах упоминается подъем в этой заметке :

Если вы используете импорт модуля ES, вы, как правило, склонны размещать свои операторы импорта в верхней части тестового файла. Но часто вам нужно указывать Jest использовать макет перед тем, как его используют модули. По этой причине Jest автоматически поднимает jest.mock вызовы наверх модуля (перед любым импортом).

Подробнее о подъеме в JavaScript см. Вы не знаете JS: Область применения и замыкания - Глава 4: Подъем

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