我有一个带有默认和命名导出的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(); }
我正在尝试使用Jest为myModule.js编写单元测试.但是当我尝试模拟命名和默认导入时,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' }); });
这种行为对我来说似乎很奇怪,因为在模拟JUST默认导入或JUST命名导入时,此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模拟命名和默认导入?是否有不同的语法可用于实现我想要的结果,我从模块中导入命名和默认值并且能够同时模拟它们?
解决方法
原文地址:https://www.jb51.cc/js/158016.html
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。