reactjs - react 警告 : Failed Context Types: Required context `router` was not specified in `Component`

标签 reactjs react-router jestjs

我正在尝试测试一个需要将react-router与app.js分开的React组件。

我有一个使用 mixin Router.Navigation 进行重定向的组件,如下所示:

var React = require('react'),
    Router = require('react-router');

var Searchbar = React.createClass({

  mixins : [Router.Navigation],

  searchTerm: function(e) {
    if (e.keyCode !== 13) {
      return;
    }

    this.context.router.transitionTo('/someRoute/search?term=' + e.currentTarget.value)
  },

  render: function() {
    return (
      <div className="searchbar-container">
        <input type="search" placeholder="Search..." onKeyDown={this.searchTerm} />
      </div>
    )
  }
});

module.exports = Searchbar;

我尝试为此编写一个测试,但遇到了困难。除了我无法测试 transitionTo 是否按预期工作这一事实之外,我还在 Jest 测试中遇到了此错误消息:

警告:上下文类型失败:搜索栏中未指定所需的上下文路由器

有谁知道我如何摆脱警告和奖励问题,如何测试转换是否按预期进行?

我对此以及 Github 上的对话进行了研究:https://github.com/rackt/react-router/issues/400是我发现的最接近问题的。看起来我需要单独导出路由器,但这似乎需要很大的开销,只运行组件测试而不发出警告 https://github.com/rackt/react-router/blob/master/docs/guides/testing.md

真的是这样吗?

最佳答案

在 React Router 0.13 版本中,mixin NavigationState 已被弃用。相反,它们提供的方法存在于对象 this.context.router 上。这些方法不再被弃用,但如果您明确使用 this.context.router ,则不需要 mixin (但您需要直接声明 contextTypes ) ;或者,您可以使用 mixin,但不需要直接使用 this.context.router 。 mixin 方法将为您访问它。

无论哪种情况,除非您通过 React Router 渲染组件(通过 Router#run),router 对象都不会提供给上下文,当然您无法调用转换方法。这就是警告告诉您的内容 - 您的组件希望将路由器传递给它,但它找不到它。

要单独测试此功能(无需创建路由器对象或通过 Router#run 运行组件),您可以将模拟的 Router 对象放置在组件的上下文中正确的位置,并测试您是否使用正确的值对其调用 transitionTo

关于reactjs - react 警告 : Failed Context Types: Required context `router` was not specified in `Component` ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30236953/

相关文章:

typescript - 使用 Jest 测试 Vuejs 和 TypeScript 会导致错误 "Property ' xxx' does not exist on type 'CombinedVueInstance'

javascript - 开 Jest 期望一个内部有函数的对象

JavaScript 和 ES6, "global"变量

javascript - TypeScript:TypeError:App 不是构造函数

javascript - 如何在 react router dom v4 的嵌套路由中获取参数?

javascript - StaticRouter 为 <Link> 标签呈现前导斜杠 [react-router 4.0.0]

javascript - Jest - 当测试失败时记录传递到测试内部调用的函数的参数

javascript - 在 ReactJS 中实现 javascript/json 对象

node.js - Push() 位置,更改地址栏中的 URL 但它不呈现组件

reactjs - 导航链接上的 activeClassName 不起作用 - react