与mocha watch

时间:2016-08-09 22:52:43

标签: javascript node.js reactjs mocha sinon

所以这里是我们的基本设置

src/MyComponent.js

import actions from `src/actions`

 export const mapDispatchToProps = dispatch => {
    return {
      onClick: () => {
        dispatch(actions.myAction())
      }
    }
 }

src/actions.js

const actions = { 
  myAction: () => () => ...
}
export default actions

src/MyComponentTest.js

 import sinon from 'sinon'
 import actions from 'src/actions'
 import { mapDispatchToProps } from 'src/MyComponent'

 describe('onClickTests, () => {
   let dispatch = sinon.spy()
   let onClick

   beforeEach(() => {
     onClick = mapDispatchToProps(dispatch).onClick
   })

   it('calls dispatch with myAction', () => {
     function f () {}
     sinon.stub(actions, 'myAction').returns(f)
     onClick()
     expect(dispatch.args[0]).to.deep.equal([f])
   })
 })

基本上,我们会检查onClick函数是否正在调用dispatch,返回值为actions.myAction。由于真实的actions.myAction会返回一个匿名函数,因此我们会将其存根以返回函数f。当我们使用Mocha运行时,一切正常,直到我们使用--watch运行。第一次运行仍然按预期传递,但是当我们保存测试并重新运行测试时,此测试将失败

expected [ [Function: f] ] to deeply equal [ [Function: f] ]

如果我对测试进行了这些更改

   it('calls dispatch with myAction', () => {
     function f () {}
     sinon.stub(actions, 'myAction').returns(2)
     onClick()
     expect(dispatch.args[0]).to.deep.equal([2])
   })

我得到了

expected [ [Function: f] ] to deeply equal [ [2] ]

所以我从中收集到的是,在第二次运行中,f返回的actions.minimize是" old"第一次运行f。我们尝试了各种不同的变体,例如使用module.exports/require代替export/import并将事物移动到Mocha挂钩(beforeEach等),似乎没有任何工作,这让我相信这是我们如何测试的一个更基本的问题。有什么建议吗?

1 个答案:

答案 0 :(得分:1)

我以前遇到过这个问题,需要一段时间来弄清楚。

不确定这是不是你的情况,但是我的组件使用了.jsx扩展,结果证明这带来了各种各样的随机问题。

Component.jsx重命名为Component.js解决了问题。