Jest onSpy无法识别React组件功能

时间:2018-10-10 20:46:40

标签: javascript reactjs jestjs enzyme

尽管尝试了一切,但这个让我完全迷住了。

我正在用Jest / Enzyme测试React组件。此测试模拟修改元素,然后调用onChange方法。

运行测试时,我从Jest那里得到了这个信息:

  

因为它不是函数,所以无法监视onChange属性;   改用undefined

为什么?

以下是组件的关键部分:

import React, {Component} from 'react';
import EntitiesPulldown from './entities-pulldown'

class NewTransactionForm extends Component  {

constructor(props) {
   super(props);

   this.state = {
       amount: "0.00",
       investors_4_picklist: [],
       selectedTType:0      
   };

   this.onChange = this.onChange.bind(this);
} 

onChange(event) {
      const value = event.target.value;
      const name = event.target.name;

      this.setState({
        [name]: value
      });
      console.log("just set "+name+"  to  "+value)

}

render() {
return (  
      <div>
           <EntitiesPulldown                                                                           
               itemList = {this.state.investors_4_picklist}                                                                                                                                                      
               handleChangeCB = {this.onChange}
             />
      </div>
  )
 }
}
export default NewTransactionForm;

非常简单。这是测试:

test('NTF calls onChange after select', () => {
  const wrapperInstance = mount(<NewTransactionForm />).instance();

  const spy = jest.spyOn(wrapperInstance, 'onChange')  //fails

  wrapperInstance.update().find('select').simulate('change',{target: { name: 'selectedTType', value : 3}});

  expect(spy).toHaveBeenCalled();
});

我也尝试了此选项,结果相同:

  const spy = jest.spyOn(NewTransactionForm.prototype, 'onChange')

我在做什么错?任何帮助都非常感谢。

1 个答案:

答案 0 :(得分:1)

感谢Garret。我对问题有新的看法,但对问题没有新的看法。 部署的组件是包装的HOC,以便使用Material-UI样式。因为它是HOC,所以它无法访问已包装组件的所有方法。

实际出口为:

NewTransactionForm.propTypes = {
  classes: PropTypes.object.isRequired,
};

export default withStyles(styles)(NewTransactionForm);

当我取出样式并导出时:

export default NewTransactionForm;

我能够访问onChange函数。我现在正在寻找使外部调用可访问包装组件方法的方法,但这是另一个问题。