具有非常简单的组件:
从 'prop-types' 导入 PropTypes 从 'react' 导入 React 导入 { connect } 从 'react-redux'
class MyComponent extends React.Component {
componentWillMount() {
if (this.props.shouldDoSth) {
this.props.doSth()
}
}
render () {
return null
}
}
MyComponent.propTypes = {
doSth: PropTypes.func.isRequired,
shouldDoSth: PropTypes.bool.isRequired
}
const mapStateToProps = (state) => {
return {
shouldDoSth: state.shouldDoSth,
}
}
const mapDispatchToProps = (dispatch) => ({
doSth: () => console.log('you should not see me')
})
export default connect(mapStateToProps, mapDispatchToProps)(MyComponent)
我想测试是否在等于doSth
时被调用。shouldDoSth
true
我写了一个测试:
describe('call doSth when shouldDoSth', () => {
it('calls doSth', () => {
const doSthMock = jest.fn()
const store = mockStore({shouldDoSth: true})
shallow(<MyComponent doSth={doSthMock}/>, { context: { store } }).dive()
expect(doSthMock).toHaveBeenCalled()
})
})
但似乎虽然我将 doSth 作为道具传递,但它被mapDispatchToProps
执行时覆盖console.log('im not a mock')
。
如何正确传递/覆盖/分配doSth
函数以使组件使用模拟而不是来自mapDispatchToProps
. 或者,也许我正在做一些根本不应该被允许的事情,并且有“正确”的方式来测试我的案例。我应该只模拟调度并检查它是否使用正确的参数调用?