Я начинаю думать, что это невозможно, но я все равно хочу спросить.
Я хочу проверить, что один из моих модулей ES6 вызывает другой модуль ES6 определенным образом. С Жасмином это очень просто -
Код приложения:
// myModule.js
import dependency from './dependency';
export default (x) => {
dependency.doSomething(x * 2);
}
И тестовый код:
//myModule-test.js
import myModule from '../myModule';
import dependency from '../dependency';
describe('myModule', () => {
it('calls the dependency with double the input', () => {
spyOn(dependency, 'doSomething');
myModule(2);
expect(dependency.doSomething).toHaveBeenCalledWith(4);
});
});
Что эквивалентно с Джестом? Я чувствую, что это такая простая вещь, которую я хочу сделать, но я рвал на себе волосы, пытаясь понять это.
Самое близкое, что я получил, - это заменить import
s на require
s и поместить их в тесты / функции. Ничего из того, что я хочу делать.
// myModule.js
export default (x) => {
const dependency = require('./dependency'); // yuck
dependency.doSomething(x * 2);
}
//myModule-test.js
describe('myModule', () => {
it('calls the dependency with double the input', () => {
jest.mock('../dependency');
myModule(2);
const dependency = require('../dependency'); // also yuck
expect(dependency.doSomething).toBeCalledWith(4);
});
});
Что касается бонусных баллов, я бы хотел, чтобы все это работало, когда функция внутри dependency.js
- экспорт по умолчанию. Тем не менее, я знаю, что слежка за экспортом по умолчанию не работает в Jasmine (или, по крайней мере, я никогда не смогу заставить его работать), поэтому я не надеюсь, что это возможно в Jest.
источник
import
кrequire
s. Спасибо за внимание, хотя.Ответы:
Я смог решить эту проблему с помощью взлома с участием
import *
. Это даже работает как для именованных, так и для экспорта по умолчанию!Для именованного экспорта:
Или для экспорта по умолчанию:
Как справедливо заметил Михай Дамиан ниже, это мутирует объект модуля
dependency
, и поэтому он «просочится» в другие тесты. Поэтому, если вы используете этот подход, вы должны сохранить исходное значение и затем устанавливать его снова после каждого теста. Чтобы сделать это легко с помощью Jest, используйте метод spyOn () вместо того,jest.fn()
потому что он поддерживает простое восстановление исходного значения, поэтому избегая ранее упомянутого «утечки».источник
dependency
файл находится в одном файлеmyModule
, он не будет работать.Вы должны смоделировать модуль и установить шпиона самостоятельно:
источник
babel-plugin-jest-hoist: The second argument of jest.mock must be a function.
так что код даже не компилируется.jest.mock
относительно тестового файла.__esModule: true
к фиктивному объекту. Это внутренний флаг, используемый переносимым кодом для определения, является ли это переносимым модулем es6 или модулем commonjs.jest.mock('../dependency', () => ({ default: jest.fn() }))
Чтобы смоделировать экспорт модуля зависимостей ES6 по умолчанию с помощью jest:
Другие варианты не работали для моего случая.
источник
Добавляю ещё Андреасу ответ. У меня была та же проблема с кодом ES6, но я не хотел изменять импорт. Это выглядело хакерским. Так я и сделал
И добавил зависимости.js в папку «__ mocks __» параллельно с зависимостью.js. Это сработало для меня. Кроме того, это дало мне возможность вернуть подходящие данные из фиктивной реализации. Убедитесь, что вы указали правильный путь к модулю, который хотите смоделировать.
источник
__mocks__/translations.js
Файл просто по умолчанию экспортjest.fn()
в чем - то вроде:export default jest.fn((id) => id)
jest.genMockFromModule
для генерации макетов из модулей. facebook.github.io/jest/docs/…export default jest.genMockFromModule('../dependency')
будут назначены все их функцииdependency.default
после вызова `jest.mock ('.. dependency'), но в остальном они будут работать так, как ожидается.expect(???)
Перейдя к 2020 году, я нашел эту ссылку решением проблемы. используя только синтаксис модуля ES6 https://remarkablemark.org/blog/2018/06/28/jest-mock-default-named-export/
Также одна вещь, которую вам нужно знать (на что у меня ушло некоторое время, чтобы понять), что вы не можете вызвать jest.mock () внутри теста; Вы должны вызвать его на верхнем уровне модуля. Однако вы можете вызывать mockImplementation () внутри отдельных тестов, если вы хотите настроить разные макеты для разных тестов.
источник
На вопрос уже дан ответ, но вы можете решить его следующим образом:
dependency.js
myModule.js:
myModule.spec.js:
источник
Я решил это по-другому. Допустим, у вас есть ваш dependency.js
Помимо этого, я создаю файл depdency.mock.js со следующим содержимым:
и в тесте, прежде чем импортировать файл с зависимостью, которую я использую:
источник