用笑话进行反应测试不支持Webpack别名中的moduleNameMapper

时间:2019-03-20 17:01:53

标签: reactjs webpack jestjs enzyme blueprintjs

我正在使用玩笑和酶来测试我的反应成分。我还将蓝图图标用作我的react组件中的依赖项之一。作为我的webpack配置的一部分,添加了以下内容:

config.resolve.alias = {
    blueprintIcons: path.resolve('./node_modules/@blueprintjs/icons'),
    blueprint: path.resolve('./node_modules/@blueprintjs/core')
};

以下添加为Jest配置的一部分:

    rootDir: '.',
    roots: [
        '<rootDir>/__test__/'
    ],
    transformIgnorePatterns: [
        '<rootDir>/node_modules/'
    ],
    transform: {
        '^.+\\.jsx?$': 'babel-jest'
    },
    testRegex: '(/__tests__/.*|(\\.|/)(test|spec))\\.jsx?$',
    moduleDirectories: ['node_modules'],
    moduleFileExtensions: [
        'js',
        'jsx',
        'json',
        'node'
    ],
    moduleNameMapper: {
        '\\.(css|scss)$': 'identity-obj-proxy',
        blueprintIcons: '<rootDir>/node_modules/@blueprintjs/core'
        blueprint: '<rootDir>/node_modules/@blueprintjs/core'
    },
    snapshotSerializers: ['enzyme-to-json/serializer']
};

这是我的组成部分:

import React, { Component } from 'react';
import Icon from 'blueprint';
import IconNames from 'blueprintIcons';
class Foo extends Component {
  render() {
      return (
        <div>
           <p>Hello Foo</p>
           <Icon icon={IconNames.HOME} iconSize={Icon.SIZE_LARGE}/>
        </div>
      );
  }
}
export default Foo;

这是我的foo.test.js

import React from 'react';
import Foo from '../../src/Components/Foo';
import Adapter from 'enzyme-adapter-react-16';
import Enzyme, { mount, shallow } from 'enzyme';

describe('Reviews component', () => {
    it('render component when loading in progress', () => {
        const mountedComponent = mount(<Foo />);
    });
});

当我尝试测试该组件时,测试失败并显示

  

TypeError:无法读取IconNames.HOME上未定义的属性“ HOME”

这是我的package.json中指定的一些软件包

"babel-cli": "6.26.0",
"babel-core": "^6.26.3",
"babel-eslint": "^10.0.1",
"babel-jest": "^23.0.1",
"babel-loader": "7.1.4",
"enzyme": "^3.9.0",
"enzyme-adapter-react-16": "^1.1.1",
"enzyme-to-json": "^3.3.4",
"jest": "^23.1.0",
"jest-html-reporter": "^2.3.0",
"@blueprintjs/core": "^2.3.1",
"react": "16.2.0"

我正在使用React 16.2.0

我尝试模拟它,但是不起作用(也许我没有正确执行),但这是我正在使用的代码:

jest.mock('@blueprintjs/icons', () => (
    { IconNames: {HOME: 'home' }}));

2 个答案:

答案 0 :(得分:1)

我认为模拟是一种可能的解决方案-不确定为什么代码无法正常工作(可能是因为它不在default键内,或者模拟名称不正确),但是您可以尝试其他方法

  1. 在您的Jest配置中,添加以下内容:
"setupFiles": [
    "./__mocks__/mockIcons.js"
],
  1. 在根文件夹中创建/__mocks__文件夹
  2. mockIcons.js内使用以下代码创建__mocks__
jest.mock("blueprint", () => ({
    default: {
        Icon: { SIZE_LARGE: 'large' }
    }
}))

jest.mock("blueprintIcons", () => ({
    default: {
        IconNames: { HOME: 'home' }
    }
}))

如果没有其他作用,请尝试使用@blueprintjs/icons作为模拟名称。

答案 1 :(得分:0)

对我来说,以下解决方案有效:

在笑话配置中:

moduleNameMapper: {
        '^blueprint': '<rootDir>/node_modules/@blueprintjs/core',
        '^@blueprintjs/(.*)$': '<rootDir>/node_modules/@blueprintjs/$1'
}

其他一切保持不变。