Jest + ES2015 导入

Posted

技术标签:

【中文标题】Jest + ES2015 导入【英文标题】:Jest + ES2015 import 【发布时间】:2016-05-25 15:10:21 【问题描述】:

我正在使用 ES2015、Jest、React 进行练习,但出现此错误:

TypeError: Property description must be an object: undefined
at defineProperties (native)
at Object.eval (<PROJECT>/node_modules/event-emitter/index.js:127:8)

经过深挖,我认为与nodeModule EventEmitter的导入或通过它扩展类有关。

这是脚本文件的代码:

import EventEmitter from 'event-emitter';
import AppDispatcher from '../dispatcher/app-dispatcher';

import 
    ACTION_CURSOR_POSITION_CHANGED,
    ACTION_IS_DRAGGING_CHANGED
 from '../constants/actions';

let _draggingStoreInstance = null;

/**
 * DraggingStore class
 */
export default class DraggingStore extends EventEmitter

    /**
     * Constructor
     */
    constructor () 
    // ...

测试文件的源代码如下:

import '../unmock/dragging-store.unmock.js';
import DraggingStore from '../../src/stores/dragging-store';

describe('Dragging Store', () => 
   let draggingStoreInstance = null;

   beforeEach(() => 
       draggingStoreInstance = DraggingStore.getInstance();
   );

   it('should be defined', () => 
       expect(DraggingStore).toBeDefined();
       expect(draggingStoreInstance).toBeDefined();
   );
);

我为排除模拟做了一个额外的文件:

jest.dontMock('../../src/stores/dragging-store.js');
jest.dontMock('../../src/dispatcher/app-dispatcher.js');
jest.dontMock('../../src/constants/actions.js');

代码本身编译后在浏览器中运行流畅,但测试引擎报错。

我在 package.json 中添加了这个:

"scripts": 
    "test": "jest"
  ,
 "jest": 
    "scriptPreprocessor": "./node_modules/babel-jest",
    "unmockedModulePathPatterns": [
      "./node_modules/react"
    ],
    "collectCoverage": true,
    "testDirectoryName": "spec",
    "moduleFileExtensions": [
      "js"
    ],
    "collectCoverageOnlyFrom": 
        // All files to test
    
  

有没有人知道如何解决这个问题? 提前谢谢...

更新:完整的源代码可以在这里找到:https://github.com/dejakob/unlease-chess

【问题讨论】:

【参考方案1】:

我意识到这已经很晚了,但是,在你发布这个问题的时候发生了很多变化。使用 Jest v19+,并假设您使用的是最新版本的 Babel,您可以按照此处的说明进行操作:

http://facebook.github.io/jest/docs/webpack.html#using-with-webpack-2

由于您使用的是模块,您需要告诉 Babel 将它们转译为 commonjs requires 以便它们可以在节点环境中运行,这就是 Jest 的工作方式。

【讨论】:

Jups,我在一年前发布了这个问题,此后 JEST 本身有了很大的改进。现在它甚至被设置在一个默认的 React Native 项目中。

以上是关于Jest + ES2015 导入的主要内容,如果未能解决你的问题,请参考以下文章

Jest 和 ES2015 导入。开玩笑地尊重 package.json 中的 pkg.module 声明

如何将 jest 与 coffeescript 和 ES6/ES2015 一起使用(例如通过 Babel)?

带有 ES6 模块的 babel-jest

Jest 是不是支持 ES6 导入/导出?

Jest React 测试 es6 导入/导出不需要的模拟

使用 babel 和 Jest 在 ES2017 中意外导入令牌