所以这里是我们的基本设置
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
等),似乎没有任何工作,这让我相信这是我们如何测试的一个更基本的问题。有什么建议吗?
答案 0 :(得分:1)
我以前遇到过这个问题,需要一段时间来弄清楚。
不确定这是不是你的情况,但是我的组件使用了.jsx
扩展,结果证明这带来了各种各样的随机问题。
将Component.jsx
重命名为Component.js
解决了问题。