【问题标题】:How do I write test for hooks?如何为钩子编写测试?
【发布时间】:2020-12-22 13:24:11
【问题描述】:

我正在对组件进行单元测试,并尝试对钩子进行测试,但我似乎无法让它工作。这是我的钩子。我需要改变什么或做什么来修复这个测试?

import { useState } from 'react';

function UseToggleState (initialValue = false) {
  const [state, setState] = useState(initialValue);
  const toggle = () => setState(!state);

  return [state, toggle];
};

export default UseToggleState

这是我正在使用的组件。

export function Todo({ id, task, completed }) {
  const classes = useStyles();
  const dispatch = useContext(DispatchContext);
  const [isEditing, toggle] = useToggleState(false);

  if (isEditing) {
    return (
      <li
        className={classes.Todo}
        style={{ overflowY: "hidden" }}
        onClick={() => toggle()}
      >
        <EditForm id={id} task={task} toggleEditForm={toggle} />
      </li>
    );
  }

  return (
    <li
      className={classes.Todo}
      onClick={() => dispatch({ type: TOGGLE_TODO, id })}
    >
      <span
        style={{
          textDecoration: completed ? "line-through" : "",
          color: completed ? "#A9ABAE" : "#34495e",
        }}
      >
        {task}
      </span>
      <div className={classes.icons}>
        <FontAwesomeIcon
          icon={faPen}
          size="1x"
          onClick={(e) => {
            e.stopPropagation();
            toggle();
          }}
        />{" "}
        <FontAwesomeIcon
          icon={faTrash}
          size="1x"
          color={"#c0392b"}
          onClick={(e) => {
            e.stopPropagation();
            dispatch({ type: REMOVE_TODO, id });
          }}
        />
      </div>
    </li>
  );
}

而测试文件如下。它一直说切换不是一个功能,我不太清楚它为什么这样做。我需要做些不同的改变才能让它发挥作用吗?

describe("useToggleState", () => {
    it("Initial toggle is true", () => {
        const { result } = renderHook(() => UseToggleState(true))

        act(() => {
            result.current.toggle
        })

        expect(result.current.state).toBeTruthy()
    })

    it("Toggle is false", () => {
        const { result } = renderHook(() => UseToggleState(false))

        act(() => {
            result.current.toggle
        })

        expect(result.current.state).toBeFalsy()
    })
})

【问题讨论】:

  • 您使用的是reactreact-test-renderer 的哪个版本?
  • react 是 16.13.1,react-test-render 是 16.13.1 @tmhao2005
  • 我为你放弃了答案。顺便说一句,测试设置看起来也不正确。钩子的第一个测试参数应该是 true 像这样:renderHook(() =&gt; UseToggleState(true))
  • 我仍然收到以下错误... expect(received).toBe(expected) // Object.is 相等 Expected: true Received: undefined 28 | }) 29 | > 30 |期望(result.current.toggle()).toBe(true) | ^ 31 | }) 32 | })
  • 断言这个expect(result.current.toggle()).toBe(true) 是做什么的?

标签: reactjs unit-testing jestjs react-hooks


【解决方案1】:

你的测试应该是:

describe("useToggleState", () => {
  it("Initial toggle is false", () => {
    const { result } = renderHook(() => UseToggleState(true))

    act(() => {
      result.current[1]()
    })

    expect(result.current[0]).toBe(false)
  })

  it("Toggle is true", () => {
    const { result } = renderHook(() => UseToggleState())

    act(() => {
      result.current[1]()
    })

    expect(result.current[0]).toBe(true)
  })
})

【讨论】:

  • 我想我还需要更改 TypeError: result.current.toggle is not a function 因为它一直说它不是一个函数
  • 您的回答正确吗?你改变了钩子的返回值吗?
  • 是的,但随后整个应用程序中断
  • 好的。只是保持实现相同。我已经使用数组而不是对象为您更新了测试
猜你喜欢
  • 1970-01-01
  • 2021-04-07
  • 1970-01-01
  • 1970-01-01
  • 2021-12-18
  • 2021-02-03
  • 2015-09-11
  • 2015-02-16
  • 1970-01-01
相关资源
最近更新 更多