如何用酶测试反应钩

Posted

技术标签:

【中文标题】如何用酶测试反应钩【英文标题】:How to test react hooks with enzyme 【发布时间】:2020-06-01 13:23:10 【问题描述】:

我在TDD过程中遇到问题,react hooks的状态没有按预期改变

// Header.tsx

import React,  useState, ChangeEvent, KeyboardEvent  from 'react';

interface Props 
  addUndoItem: (item: string) => void;


function Header(props: Props) 
  const [value, setValue] = useState('');

  const handleChange = (e: ChangeEvent< value: string >) => 
    setValue(e.target.value);
  ;

  const handleKeyUp = (e: KeyboardEvent) => 
    if (value && e.keyCode === 13) 
      props.addUndoItem(value);
    
  ;

  return (
    <div>
      <input
        onChange=handleChange
        onKeyUp=handleKeyUp
        value=value
        data-test="input"
      />
    </div>
  );

// 测试/Header.tsx

it('the fn may invoked when press enter', () => 
      const userInput = 'test';
      const fn = jest.fn();
      const wrapper = shallow(<Header addUndoItem=fn />);
      const inputEle = wrapper.find('[data-test="input"]');

      inputEle.simulate('change', 
        target: 
          value: userInput
        
      );

      inputEle.simulate('keyUp', 
        keyCode: 13
      );
      expect(fn).toHaveBeenCalled();
      expect(fn).toHaveBeenCalledWith(userInput);
    );

exec模拟变化时,Header hooks中的值还是''应该是test,在浏览器中运行成功

错误是

expect(jest.fn()).toHaveBeenCalled()

Expected number of calls: >= 1
Received number of calls:    0

  48 |         keyCode: 13
  49 |       );
> 50 |       expect(fn).toHaveBeenCalled();
     |                  ^
  51 |       expect(fn).toHaveBeenCalledWith(userInput);
  52 |     );
  53 | 

【问题讨论】:

这能回答你的问题吗? When should you use render and shallow in Enzyme / React tests? 【参考方案1】:

您需要使用mount 而不是shallow,否则您的input 组件将无法正确呈现,因此在测试期间将无法使用。

【讨论】:

以上是关于如何用酶测试反应钩的主要内容,如果未能解决你的问题,请参考以下文章

用开玩笑酶测试反应路由器 v4

反应酶测试,无法读取未定义的属性“拥有”

如何使用酶、笑话和反应测试材料设计事件监听器

单元测试:用酶反应上下文 api 返回一个空对象

使用酶在反应测试中查找渲染子组件的数量?

在“if”语句中没有调用模拟函数 - 用玩笑和酶反应应用程序测试?