javascript - 从 react-router-bootstrap 使用 LinkContainer 时测试失败

标签 javascript reactjs react-router react-router-bootstrap

所以我正在制作一个 ReactJS 应用程序,其中包括 reactstrap、react-router 和 react-router-bootstrap。问题是当我测试包含 LinkContainer 的组件时,出现以下错误,使我的单元测试失败:

console.error node_modules\prop-types\checkPropTypes.js:19 Warning: Failed context type: The context router is marked as required in LinkContainer, but its value is undefined. in LinkContainer (at Header.js:27)

谁能帮帮我?这是代码,例如在 header.js 中:

import { LinkContainer } from "react-router-bootstrap";
import { ROUTE_POKEDEX } from "../../constants/constants";

export default class Header extends Component {
  constructor(props) {
    super(props);

    this.toggle = this.toggle.bind(this);
    this.state = {
      isOpen: false
    };
  }

  toggle() {
    this.setState({
      isOpen: !this.state.isOpen
    });
  }

  render() {
    return (
      <Container fluid className="header">
        <Navbar expand="md">
          <LinkContainer to={ROUTE_POKEDEX}>
            <NavbarBrand>Pokédex</NavbarBrand>
          </LinkContainer>
          <NavbarToggler onClick={this.toggle} />
        </Navbar>
      </Container>
    );
  }
}

测试.js

import Header from "./Header";

it("renders without crashing", () => {
  const div = document.createElement("div");
  ReactDOM.render(<Header />, div);
  ReactDOM.unmountComponentAtNode(div);
});

it("has valid snapshot", () => {
  const tree = renderer.create(<Header />).toJSON();
  expect(tree).toMatchSnapshot();
});

最佳答案

问题是 LinkContainer组件需要被 Router 包裹,因此在您的单元测试中出现错误(当在您的测试中呈现单个组件时,不会调用路由器)。可能的解决方案是使用 <MemoryRouter> .
来自文档:

Starting at specific routes

supports the initialEntries and initialIndex props, so you can boot up an app (or any smaller part of an app) at a specific location.

参见:https://reacttraining.com/react-router/core/guides/testing/starting-at-specific-routes

在 op 的测试用例场景中,可能的解决方案是在呈现组件(未测试)时在单元测试中执行类似的操作:
ReactDOM.render(<MemoryRouter><Header /></MemoryRouter>, div);

关于javascript - 从 react-router-bootstrap 使用 LinkContainer 时测试失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51088515/

相关文章:

javascript - 如何使 ES6 类最终(不可子类化)

reactjs - 处理同一元素的 React onDoubleClick 和 single onClick

javascript - CORS 问题 : Getting error "No ' Access-Control-Allow-Origin' header is present"when it actually is

javascript - 在 javascript 中围绕 3D 轴旋转表面

reactjs - 在 Netlify 上部署的 Gatsby Starter 上安装 'react-bootstrap'

javascript - 从函数子组件调用类中的回调函数时,React 'this' undefined

javascript - React-Router:如何测试渲染链接的 href?

reactjs - react 路由器,以编程方式导航时传递数据?

reactjs - Material UI List onClick 触发嵌套列表上的 click 事件

c# - 在mvc中使用javascript隐藏和显示菜单