测试 React 组件方法正在调用函数传递作为道具

Posted

技术标签:

【中文标题】测试 React 组件方法正在调用函数传递作为道具【英文标题】:Test React component method is calling function pass as a prop 【发布时间】:2018-02-02 15:49:52 【问题描述】:

我想测试当从 React 组件调用方法时,它会触发一个函数作为道具传递给组件。 方法是这样的:

customMethod() 
  // Do something

  this.props.trackEvent(
    category: 'eventCategory',
    action: 'eventAction',
    label: 'eventAction',
  );

  // Do something else

方法可以通过不同的方式调用,所以我只想做一个通用的测试:如果customMethod被调用,应该用数据触发this.props.trackEvent。

有没有办法使用 jest 和/或酶来触发方法调用?我读过关于做这样的事情:

const wrapper = shallow(<AdPage ...baseProps />);
wrapper.instance().customMethod();

但它不起作用……任何想法。 我是测试的新手,所以也许我应该对这种测试使用不同的方法?

【问题讨论】:

【参考方案1】:

假设您的 customMethod 是一个组件方法,我会这样测试它:

(1) 在创建包装器时将 trackEvent 道具伪装成 jest.fn()

(2) 使用wrapper.instance().customMethod(); 调用您的customMethod

(3) 确保 props.trackEvent 具有你提到的参数。

举个例子:

test('customMethod should call trackEvent with the correct argument', () => 
  const baseProps = 
    // whatever fake props you want passed to the component
    // ...
    trackEvent: jest.fn(),
  ;
  const wrapper = shallow(<AdPage ...baseProps />);

  wrapper.instance().customMethod();

  expect(baseProps.trackEvent).toHaveBeenCalledTimes(1);

  expect(baseProps.trackEvent).toHaveBeenCalledWith(
    category: 'eventCategory',
    action: 'eventAction',
    label: 'eventAction',
  );
); 

【讨论】:

我正朝着好的方向前进,但您节省了很多旅行。谢谢!

以上是关于测试 React 组件方法正在调用函数传递作为道具的主要内容,如果未能解决你的问题,请参考以下文章

Array.map 中的 React 功能组件在将函数作为道具传递时总是重新渲染

将函数作为道具传递给 Typescript React 功能组件

在反应组件中将样式作为道具传递

React Context API,从子组件设置上下文状态,而不是将函数作为道具传递

将组件作为道具传递时在 Flow 中键入 React 组件

在 React 的子组件中将状态作为道具传递