首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >模拟点击事件和调用历史推送测试函数(jest-enzyme)

模拟点击事件和调用历史推送测试函数(jest-enzyme)
EN

Stack Overflow用户
提问于 2020-09-12 02:03:03
回答 2查看 722关注 0票数 0

我尝试用一个触发function的按钮来测试组件,这个function从useState获取一个状态,并导航到一个内部带有参数的新路由。如何测试函数?我得到一个错误:

代码语言:javascript
复制
TypeError: history.push is not a function

组件:

代码语言:javascript
复制
import React, { useState, useEffect } from "react";
import "./Join.css";
import { useHistory } from "react-router-dom";

const Join = () => {
  const history = new useHistory();
  const [joinFormField, setJoinFormField] = useState({
    username: "",
    room: "JavaScript",
  });

  const changeFormHandler = (e) => {
    setJoinFormField({
      ...joinFormField,
      [e.target.name]: e.target.value,
    });
  };

  const joinChatHandler = () => {
    history.push("/chat", {
    user: joinFormField,
  });
  };

  return (
    <div className="JoinContainer">
      <header className="JoinHeader">
        <h1>
          <i className="fas fa-comments"></i> DeveloperChat
        </h1>
      </header>
      <main className="JoinMain">
        <form className="Form">
          <div className="FormControl">
            <label className="Label">NickName</label>
            <input
              className="Input"
              type="text"
              name="username"
              id="username"
              placeholder="Enter nickname..."
              required
              value={joinFormField.userName}
              onChange={changeFormHandler}
            />
          </div>
          <div className="FormControl">
            <label className="Label">Choose Room</label>
            <select
              className="RoomSelect"
              name="room"
              id="room"
              value={joinFormField.room}
              onChange={changeFormHandler}
            >
              <option value="JavaScript">JavaScript</option>
              <option value="Python">Python</option>
              <option value="PHP">PHP</option>
              <option value="C#">C#</option>
              <option value="Ruby">Ruby</option>
              <option value="Java">Java</option>
            </select>
          </div>
          <button className="JoinBtn" onClick={joinChatHandler}>
            Join Chat
          </button>
        </form>
      </main>
    </div>
  );
};

export default Join;

规范文件:

代码语言:javascript
复制
import * as React from "react";
import { shallow } from "enzyme";
import Join from "../../../containers/Join/Join";

describe("MyComponent", () => {
  it("should navigate to chat when click on join btn", () => {
    const joinChatHandler = jest.fn();
    const wrapper = shallow(<Join onClick={joinChatHandler} />);
    wrapper.find("button").simulate("click");
    expect(joinChatHandler).toHaveBeenCalled();
  });
});

如何测试此功能?我试图模拟一个历史对象,但得到了同样的错误。谢谢。

EN

回答 2

Stack Overflow用户

发布于 2020-09-12 02:42:40

找到解决方案:

代码语言:javascript
复制
const mockHistoryPush = jest.fn();
jest.mock("react-router-dom", () => ({
  ...jest.requireActual("react-router-dom"),
  useHistory: () => ({
    push: mockHistoryPush,
  }),
}));

describe("click handler", () => {
  it("should navigate to chat when click on join btn", () => {
    const joinFormField = {
      username: "",
      room: "JavaScript",
    };
    wrapper.find("button").simulate("click");

    expect(mockHistoryPush).toHaveBeenCalledWith("/chat", {
      user: joinFormField,
    });
  });
});
票数 1
EN

Stack Overflow用户

发布于 2020-09-12 02:07:09

尝试使用:

代码语言:javascript
复制
this.props.history.push(""/chat")
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63852155

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档