我正在尝试测试一个React组件,它需要与app.js分开的react-router.
我有一个使用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;
我试图为此写一个测试,但碰到了一堵墙.除了我无法测试转换以便按预期工作之外,我还在我的Jest测试中遇到了此错误消息:
警告:上下文类型失败:未在搜索栏中指定所需的上下文路由器.
有谁知道如何摆脱警告和奖金问题,我如何测试转换是否按预期工作?
我已经在这里和Github上的这个对话进行了研究:https://github.com/rackt/react-router/issues/400是我发现的最接近问题的.看起来我需要单独导出路由器,但这似乎是很多开销只是运行组件测试没有警告la https://github.com/rackt/react-router/blob/master/docs/guides/testing.md
这真的是要走的路吗?
在React Router的0.13版本中,不推荐使用mixins Navigation和State.相反,它们提供的方法存在于对象this.context.router上.这些方法不再被弃用,但如果你明确地使用this.context.router,则不需要mixin(但是你需要直接声明contextTypes);或者,您可以使用mixin,但不需要直接使用this.context.router. mixin方法将为您访问它.
在任何一种情况下,除非您通过React Router(通过Router#run)渲染组件,否则路由器对象不会提供给上下文,当然您也无法调用转换方法.这就是警告告诉你的 – 你的组件希望将路由器传递给它,但它无法找到它.
要单独测试它(不创建路由器对象或通过Router#run运行组件),您可以在组件的上下文中将模拟的路由器对象放在正确的位置,并测试您使用正确的值调用transitionTo.