Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/398.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Jest:同时具有默认和命名导出的模拟ES6模块_Javascript_Unit Testing_Jestjs_Es6 Modules - Fatal编程技术网

Javascript Jest:同时具有默认和命名导出的模拟ES6模块

Javascript Jest:同时具有默认和命名导出的模拟ES6模块,javascript,unit-testing,jestjs,es6-modules,Javascript,Unit Testing,Jestjs,Es6 Modules,我有一个ES6模块,具有默认和命名导出: /** /src/dependency.js **/ export function utilityFunction() { return false; } export default function mainFunction() { return 'foo'; } 第二个ES6模块正在使用它: /** /src/myModule.js **/ import mainFunction, { utilityFunction } from './

我有一个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'
    });
});
这种行为对我来说真的很奇怪,因为当模拟默认导入或命名导入时,这个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模拟命名导入和默认导入?是否有一种不同的语法可以用来实现我想要的结果,即我从模块中导入命名值和默认值,并能够模拟它们?

您有一个语法错误。。。myModule.js中的默认导出中省略了
函数
关键字。应该是这样的:

import mainFunction, { utilityFunction } from './dependency';

export default function myModule() {
    if (!utilityFunction()) return 2;
    return mainFunction();
}

我不确定您是如何让测试运行的,但我只是在本地尝试了一下,它通过了。

另一种解决方案对我不起作用。我就是这样做的:

  jest.mock('../src/dependency', () => ({
    __esModule: true,
    utilityFunction: 'utilityFunction',
    default: 'mainFunction'
  }));
另一种方法是:

jest.unmock('../src/dependency');

const myModule = require('../src/dependency');
myModule.utilityFunction = 'your mock'

嗨,djfdev,谢谢你的回答!事实证明你是对的,我提供的示例代码在我的环境中确实有效。我在问题中所写的内容被证明是对我遇到的问题的过度简化——在我的用例中,默认的导入是React组件。编辑问题以提供实际代码是否值得?否则,我可以将这个问题标记为已回答并打开一个新的问题。在仔细考虑之后,我将标记您的答案为正确并打开一个新的问题。再次感谢!我最新的问题是:嗨,你试过我的答案了吗?我想这就是你要找的。另外,如果有效的话,你能给出最好的答案吗?