使用Jest和Enzyme,如何测试通过props传递的功能?

时间:2018-12-11 17:59:23

标签: javascript reactjs jestjs enzyme

使用Jest和酶,如何测试this.props.functionToTest是否运行?

class TestComponent extends Component {
   static propTypes = {
     functionToTest: PropTypes.func
   }
   componentDidMount() {
     this.props.functionToTest()
   }
}

在Jest中,我尝试创建过模拟道具并在安装组件时将它们传递给他们。

let props = {
  functionToTest = jest.fn(() => {});
}
beforeEach(() => {
  const wrapper = mount(<TestComponent {...props} />
}

componentDidMount函数中的console.log显示functionToTest为未定义。显然在挂载过程中传递道具无效。

问题1:如何传递将在componentDidMount函数中显示的模拟道具?

问题2:一旦该功能可用,我如何获得对该功能的访问权限,以便可以使用spyOn或类似工具测试该功能是否已运行?

2 个答案:

答案 0 :(得分:1)

我不知道您的确切设置,但这是我要这样做的方式:

  • 像以前一样用jest.fn()模拟功能
  • 将模拟传递到要安装的组件(显然您已经这样做了)
  • 检查它是否与expect(...).toBeCalled().toHaveBeenCalled()一起运行(不同Jest版本之间的差异)

let props = {
  functionToTest: jest.fn() // You don't need to define the implementation if it's empty
};

beforeEach(() => {
  const wrapper = mount(<TestComponent {...props} />
}

// In the test code:
it('does something', () => {
    expect(props.functionToTest).toBeCalled();
    // OR... depending on your version of Jest
    expect(props.functionToTest).toHaveBeenCalled();
});

答案 1 :(得分:0)

问题最终导致TestComponent仅在Redux包装器中导出。在类级别添加导出,并在Jest测试导入中对其进行销毁,以及上面发布的解决方案Henrick对其进行了修复。