不确定这是否正是您要寻找的,但我通过创建一个辅助函数来解决这个问题,该函数在为依赖于路由器状态的组件编写开玩笑测试时使用。
//router-test-helper
var Router = require('react-router'),
Route = Router.Route,
TestLocation = require('react-router/lib/locations/TestLocation');
module.exports = function(React){
TestUtils = React.addons.TestUtils;
return {
getRouterComponent: function(targetComponent, mockProps) {
var component,
div = document.createElement('div'),
routes = [
React.createFactory(Route)({
name: '/',
handler: targetComponent
})
];
location = new TestLocation('/');
Router.run(routes, location, function (Handler) {
var mainComponent = React.render(React.createFactory(Handler)(mockProps), div);
component = TestUtils.findRenderedComponentWithType(mainComponent, targetComponent);
});
return component;
}
};
};
所有这些都不是我一个人写的,我想大部分都是我从你链接到的那个现已失效的指南中提取的。如果我没记错的话……已经有一段时间了。
在你拥有它之后,你可以在你的测试中使用它,有点像这样。
//test-example
jest.dontMock('../src/js/someComponent');
var React = require('react/addons');
var TestUtils = React.addons.TestUtils;
var routerHelper = require('../router-test-helper')(React);
var SomeComponent = require('../srcs/js/someComponent');
describe('Some Component', function(){
it('should be testable', function(){
var mockProps = {};
var renderedComponent = routerHelper.getRouterComponent(SomeComponent, mockProps);
// Test your component as usual from here.....
///////////////////////////////////////////////
var inputs = TestUtils.scryRenderedDOMComponentsWithTag(renderedComponent, 'input');
//blah blah blah
});
});
这假设你的非模拟模块路径中有 React 和助手
如果您实际上是在尝试测试特定路线的特定内容,或者在路线之间进行转换……我不确定这是否是一个好方法。使用更多的集成测试-y 可能会更好,比如硒或其他东西。另外......一旦反应路由器的 1.0 出来,这可能不会起作用。但是测试'The React Way'(tm)可能更容易,因为所有路由的东西都将通过道具处理。至少那是我从我读过的那一点点得到的印象。