我正在寻找一个噩梦,为测试React Router链接找到一个好的解决方案。它正在传递'渲染类别正确'但是零链接正在通过测试,我已经尝试了很多不同的东西,但仍然无处可去。
以下是我要测试的内容:
组件
import React from 'react';
import { Link } from 'react-router';
class Categories extends React.Component {
constructor(props, context){
super(props);
context.router
}
render() {
return (
<nav className="categories">
<ul>
<li><Link to="devices">Devices</Link></li>
<li><Link to="cases">Cases</Link></li>
<li><Link to="layouts">Layouts</Link></li>
<li><Link to="designs">Designs</Link></li>
</ul>
</nav>
);
}
}
Categories.contextTypes = {
router: React.PropTypes.func.isRequired
};
export default Categories;
StubRouterContext
import React from 'react';
import objectAssign from 'object-assign';
var stubRouterContext = (Component, props, stubs) => {
function RouterStub() { }
objectAssign(RouterStub, {
makePath () {},
makeHref () {},
transitionTo () {},
replaceWith () {},
goBack () {},
getCurrentPath () {},
getCurrentRoutes () {},
getCurrentPathname () {},
getCurrentParams () {},
getCurrentQuery () {},
isActive () {},
getRouteAtDepth() {},
setRouteComponentAtDepth() {}
}, stubs)
return React.createClass({
childContextTypes: {
router: React.PropTypes.func,
routeDepth: React.PropTypes.number
},
getChildContext () {
console.log('blah');
return {
router: RouterStub,
routeDepth: 0
};
},
render () {
return <Component {...props} />
}
});
};
export default stubRouterContext;
组件测试
var expect = require('chai').expect;
var React = require('react/addons');
var Categories = require('../app/src/js/components/Categories.React.js');
var stubRouterContext = require('../test-utils/stubRouterContext.js');
var TestUtils = React.addons.TestUtils;
describe('Categories', function() {
var categoriesWithContext = stubRouterContext(Categories);
it('renders Categories properly', function() {
var categories = TestUtils.renderIntoDocument(<categoriesWithContext />, {});
});
it('renders 4 links', function() {
var catLinks = TestUtils.scryRenderedDOMComponentsWithTag(categoriesWithContext, 'a');
expect(catLinks).to.have.length(4);
});
});
答案 0 :(得分:1)
我注意到的第一件事是你没有在第二次测试中重新渲染“categoriesWithContext”。
export CC=/usr/local/Cellar/apple-gcc42/4.2.1-5666.3/bin/gcc-4.2
export CC=/usr/local/Cellar/apple-gcc42/4.2.1-5666.3/bin/gcc-4.2
虽然我自己没有运行你的代码,但我接下来要注意的是你获取链接的方式。在我的测试中,我必须手动挖掘层次结构。
试试这个。
it('renders 4 links', function() {
var categories = TestUtils.renderIntoDocument(<categoriesWithContext />, {});
var catLinks = TestUtils.scryRenderedDOMComponentsWithTag(categories, 'a');
expect(catLinks).to.have.length(4);
});
答案 1 :(得分:1)
我有完全相同的问题。在react-router的最新版本中,您不需要上下文来呈现链接元素,因此这不是问题。但是,如果您像我一样停留在API 1.0之前的版本,那么stubRouterContext方法效果很好。
OP和我发现我们的包装器呈现为空的唯一原因是使用了camelCase组件名称。
var categoriesWithContext = stubRouterContext(Categories);
变为var CategoriesWithContext = stubRouterContext(Categories);
。
因此var categories = TestUtils.renderIntoDocument(<categoriesWithContext />,{});
成为var categories = TestUtils.renderIntoDocument(<CategoriesWithContext />,{});
。
这种方法的解释在这里 - https://gist.github.com/sebmarkbage/f1f4ba40816e7d7848ad。