用 Jest 测试 onChange 事件

Posted

技术标签:

【中文标题】用 Jest 测试 onChange 事件【英文标题】:Testing onChange event with Jest 【发布时间】:2020-03-08 14:32:31 【问题描述】:

根据我的代码覆盖率,我需要测试在我的onChange 事件中调用的函数。这实际上是我使用 useState 挂钩更新功能组件状态的地方。

这是我的组件:

const Component:React.FC<> = () => 
  const value, setState = useState('');
  return(
    <View>
      <CustomComponent 
        onChange=(value) => setState(value)
      />
    </View>
  )

customComponent 是从 React Input 组件派生的组件。 当其中的文本发生更改时,它会调用 onChange 函数作为其属性与文本一起传递。这就是父组件的方式,它将文本输入的值设置为其状态,如上所示。

我的代码覆盖率返回此分析:

onChange=//(value) => setState(value)//

// 之间的代码必须被覆盖。我真的不明白我怎么能涵盖这个。第一个想法是使用模拟函数,但我似乎找不到如何模拟它到 onChange 事件,因为我没有将任何东西作为道具传递给主组件。

【问题讨论】:

【参考方案1】:

经过几次测试,我终于明白,覆盖并不是要求对 onChange 函数进行实际测试,而是要求评估的值。因此,这就是我正在做的事情:

    获取 TextInput 子组件 更改其文本 评估其呈现的内容

我在这里使用@testing-library/react-native 是因为它可以通过使用accessibilityLabel 来更轻松地选择树组件(它实际上让我了解了该道具的重要性)。 下面是测试的样子:

describe('Testing useState functions', () => 
    test('test', () => 
      //Rendering the component and its tree
      const  container, getByLabelText  = render(<SignupView />);
      //Extracting the child, username_input component with his accessibilityLabel
      const username_input = getByLabelText('username_input');
      const email_input = getByLabelText('email_input');
      //Fire a native changeText event with a specific value
      fireEvent.changeText(username_input, 'doe');
      fireEvent.changeText(email_input, 'doe@joe.com');
      //Checking the rendered value 
      expect(username_input.props.value).toEqual('doe');
      expect(email_input.props.value).toEqual('doe@joe.com');
    );
  );

【讨论】:

以上是关于用 Jest 测试 onChange 事件的主要内容,如果未能解决你的问题,请参考以下文章

Vue & Jest。子组件发出事件时调用测试方法

如何从 TextInput(onChange 或 onTextChange)创建 rxjs Observable

如何为 React 测试库中的 Select Box onChange 方法编写测试用例?

document.querySelector CHANGE事件?

Jest Test 中的触发事件不调用 Method

React 测试库未在快照中显示输入 onChange 道具