如何使用Enzyme在React组件内测试ReactiveDict中的动作道具

时间:2016-08-23 05:15:12

标签: unit-testing meteor reactjs enzyme mantrajs

我正在使用ReactiveDict的应用。我的项目是用Meteor建造的,有Mantra规范。

我有一个名为Login的React组件。这个概念是,当组件呈现时,ReactiveDict状态被清除,因为组件呈现时没有错误。那很好。我的容器中有这个代码:

export const depsMapper = (context, actions) => ({
  context: () => context,
  loginUser:actions.login.loginUser,
  clearState: actions.globals.clearState
});

这些是组件将执行的操作。在我的组件中:

componentWillMount(){
    this.props.clearState('LOGIN_ERROR_MESSAGE');
}

最后,在我的测试代码中,我有:

it.only('should render a <Form/> component', () => {
   const loginWrapper = shallow(<Login/>);
   expect(loginWrapper.find(Form)).to.have.length(1);
 });

当我运行npm test时,this.props.clearState不是函数。我该如何解决这个问题?提前谢谢。

1 个答案:

答案 0 :(得分:0)

我认为在卸载时清除错误会更方便吗? ReactiveDict不是持久的,所以 - 在卸载时清除状态 - 如果刷新页面或卸载组件,错误将被清除。所以在安装之前没有理由清除状态。通常你会在mantrajs中做这样的事情:

export const composer = ({context, clearState}, onData) => {
  const {LocalState} = context();
  const error = LocalState.get('LOGIN_ERROR_MESSAGE');
  onData(null, {error});

  // return the function that clears the state and the state gets reset on unmount
  return clearState;
};

export const depsMapper = (context, actions) => ({
  context: () => context,
  loginUser: actions.login.loginUser,
  clearState: actions.globals.clearState
});

export default composeAll(
  composeWithTracker(composer),
  useDeps(depsMapper)
)(Login);