javascript - 如何测试react-router-dom?

标签 javascript reactjs react-router react-router-dom

问题

我已阅读https://github.com/ReactTraining/react-router/blob/master/packages/react-router/docs/guides/testing.md

我想测试 react-router-dom,我不关心它是如何工作的,我只需要确保该库正在我的项目样板中工作。

复制

我正在测试这个组件

    <Link to="/toto">
      toto
    </Link>

这是测试

  it('it expands when the button is clicked', () => {
    const renderedComponent = mount(<Wrapper>
      <MemoryRouter initialEntries={['/']}>
        <Demo />
      </MemoryRouter>
    </Wrapper>);
    renderedComponent.find('a').simulate('click');
    expect(location.pathname).toBe('toto');
  });

预期

真实

结果

空白

问题

如何测试 react-router-dom

最佳答案

如果您查看 Link 的代码,你会看到这段代码:

handleClick = event => {
    if (this.props.onClick) this.props.onClick(event);

    if (
      !event.defaultPrevented && // onClick prevented default
      event.button === 0 && // ignore everything but left clicks
      !this.props.target && // let browser handle "target=_blank" etc.
      !isModifiedEvent(event) // ignore clicks with modifier keys
    ) {
      event.preventDefault();

      const { history } = this.context.router;
      const { replace, to } = this.props;

      if (replace) {
        history.replace(to);
      } else {
        history.push(to);
      }
    }
  };

所以,大概你会发现 Link而不是a并重写此方法以将值返回到您自己的回调,您可以验证 <Link> 上设置的路径,这并不直接测试react-router但它会验证您在链接中设置的路径是否正确,这就是您的测试似乎正在验证的路径。

所以类似(未经测试的代码):

const link = renderedComponent.find(Link)
let result = null
link.handleClick = event => {

      const { replace, to } = link.props;

      if (replace) {
         result = null //we are expecting a push
      } else {
        result = to
      }
    }
  };
link.simulate('click')
expect(result).toEqual('/toto') // '/toto' or 'toto'?

更新

我意识到上面的内容不适用于浅渲染,但是,如果您只想检查 to 是否有效属性是正确的,你可以用 expect(link.props.to).toEqual('/toto') 来做到这一点.

关于javascript - 如何测试react-router-dom?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49292154/

相关文章:

javascript - React - 如何返回到上一个分页页面?

reactjs - history.push() 是 react 中的异步调用吗?

javascript - 如何自动/动态导入自己的 angularjs javascript 文件?

javascript - 正则表达式用jQuery中的特殊字符替换子字符串

javascript - flexWrap 不适用于 React Native 中的 <Text> 元素

reactjs - 错误: Unknown dataProvider function: toJSON

javascript - react 路由器在按钮单击时不起作用

javascript - 接下来如何使用自定义内部服务器错误? (500内部服务器错误)

javascript - 客户端计算机未连接到服务器

javascript - 添加文件按钮如果超过一个则不起作用(jquery 文件上传插件)