javascript – Jest:Mock ES6模块,包含默认导出和命名导出

我有一个带有认和命名导出的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模拟命名和认导入?是否有不同的语法可用于实现我想要的结果,我从模块中导入命名和认值并且能够同时模拟它们?

解决方法

您有语法错误… myModule.js中的认导出中省略了function关键字.应该是这样的:
import mainFunction,{ utilityFunction } from './dependency';

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

我不确定你是如何通过其他方式进行测试的,但我只是在本地尝试了它并且它通过了.

相关文章

前言 做过web项目开发的人对layer弹层组件肯定不陌生,作为l...
前言 前端表单校验是过滤无效数据、假数据、有毒数据的第一步...
前言 图片上传是web项目常见的需求,我基于之前的博客的代码...
前言 导出Excel文件这个功能,通常都是在后端实现返回前端一...
前言 众所周知,js是单线程的,从上往下,从左往右依次执行,...
前言 项目开发中,我们可能会碰到这样的需求:select标签,禁...