У меня есть модуль ES6 как с экспортом по умолчанию, так и с именованным экспортом:
/** /src/dependency.js **/
export function utilityFunction() { return false; }
export default function mainFunction() { return 'foo'; }
Его использует второй модуль ES6:
/** /src/myModule.js **/
import mainFunction, { utilityFunction } from './dependency';
// EDIT: Fixed syntax error in code sample
// export default myModule() {
export default function myModule() {
if (!utilityFunction()) return 2;
return mainFunction();
}
Я пытаюсь написать модульный тест для myModule.js с помощью Jest. Но когда я пытаюсь имитировать как именованный импорт, так и импорт по умолчанию, Jest, похоже, имитирует только именованный импорт. Он продолжает использовать фактическую реализацию импорта по умолчанию и не позволяет мне издеваться над ним даже после того, как я вызываю .mockImplementation (). Вот код, который я пытаюсь использовать:
/**
* Trying to mock both named and default import.
* THIS DOESN'T WORK.
*/
/** /tests/myModule.test.js **/
import mainFunction, { utilityFunction } from '../src/dependency';
import myModule from '../src/myModule';
jest.mock('../src/dependency');
mainFunction.mockImplementation(() => 1);
utilityFunction.mockImplementation(() => true);
describe('myModule', () => {
it('should return the return value of mainFunction when the result of utilityFunction is true', () => {
expect(myModule()).toEqual(1); // FAILS - actual result is 'foo'
});
});
Такое поведение кажется мне действительно странным, потому что при насмешке ТОЛЬКО импорта по умолчанию или ТОЛЬКО именованного импорта этот API работает нормально. Например, в случае, когда myModule.js импортирует только импорт по умолчанию, это довольно легко сделать:
/**
* Trying to mock just the default import.
* THIS WORKS.
*/
/** /src/myModule.js **/
import mainFunction from './dependency';
// EDIT: Fixed syntax error in code sample
// export default myModule() {
export default function myModule() {
return mainFunction();
}
/** /tests/myModule.test.js **/
// If only mainFunction is used by myModule.js
import mainFunction from '../src/dependency';
import myModule from '../src/myModule';
jest.mock('../src/dependency');
mainFunction.mockImplementation(() => 1);
describe('myModule', () => {
it('should return the return value of mainFunction', () => {
expect(myModule()).toEqual(1); // Passes
});
});
В случае, когда используется только экспорт с именем 'utilityFunction', также довольно легко имитировать импорт:
/**
* Trying to mock both named and default import.
* THIS WORKS.
*/
/** /src/myModule.js **/
import { utililtyFunction } from './dependency';
// EDIT: Fixed syntax error in code sample
// export default myModule()
export default function myModule() {
return utilityFunction();
}
/** /tests/myModule.test.js **/
// If only utilityFunction is used by myModule.js
import { utilityFunction } from '../src/dependency';
import myModule from '../src/myModule';
jest.mock('../src/dependency);
utilityFunction.mockImplementation(() => 'bar');
describe('myModule', () => {
it('should return the return value of utilityFunction', () => {
expect(myModule()).toEqual('bar'); // Passes
});
});
Можно ли с помощью Jest смоделировать именованный импорт и импорт по умолчанию? Есть ли другой синтаксис, который я могу использовать для достижения желаемого результата, когда я импортирую как именованные, так и значения по умолчанию из модуля и могу издеваться над ними обоими?