为什么我需要在jest中使用`module.exports`?我怎么能避免呢?

时间:2015-07-17 14:15:27

标签: javascript coffeescript reactjs jestjs

我在尝试使用jest框架测试反应js代码时遇到了麻烦。

让我们说这是我的组成部分:

# coffee/global_widget.coffee
@GlobalWidget = React.createClass
  render: ->
    <div className='row'>
      <div className='col-md-12'>
        <TerminalWidget />
      </div>
    </div>

# coffee/terminal_widget.coffee
@TerminalWidget = React.createClass
  render: ->
    <div>Hey! This is the terminal!</div>

所以,我想用jest测试它。

jest.dontMock '../coffee/global_widget'

describe 'GlobalWidget', ->
  global.React = require('react/addons')
  GlobalWidget = require('../coffee/global_widget')
  TestUtils = React.addons.TestUtils

  globalWidgetForTest = TestUtils.renderIntoDocument(<GlobalWidget />)
  # body of the test

我遇到了麻烦:

npm test

> terminal-ui@0.0.2 test /home/alex/my_project
> jest

Using Jest CLI v0.4.5
 FAIL  __tests__/global_widget-test.coffee (0.276s)
● GlobalWidget › it encountered a declaration exception
  - ReferenceError: GlobalWidget is not defined

如果我将module.exports = @GlobalWidget追加到coffee/global_widget.coffee,那么我会TerminalWidget is not defined。什么是module.exports=,为什么我需要为代码中的每个组件添加它们?

1 个答案:

答案 0 :(得分:1)

看起来jest无法访问您的全局变量,因此您需要导出每个文件并在必要时需要它们。
您需要使用module.exports,因为您在此行GlobalWidget = require('../coffee/global_widget')中使用了requirejs语法。这样做可以隔离您的代码,以防止出现一堆全局可用的代码。这样,您导入(使用require)并导出(使用module.exports = ...)仅实际需要的代码。另外,在这种情况下,它允许诸如jest之类的进程获得对其他可用文件的访问。

如果你绝对不想使用requirejs(建议使用它),你可以尝试将它们添加到你的全局变形中,或者摆弄宝石{{3}},以便在测试套件之前使用它们,虽然这可能比仅导出模块更困难