我遵循React文档的建议,通过组合创建一个专门的组件:
export default class AlertPanel extends React.Component {
constructor(props) {
super(props);
}
render() {
textRows = <div>{this.props.text}</div>;
}
return (
<Alert bsStyle={this.props.style} onDismiss={this.props.onDismiss}>
{textRows}
</Alert>
);
}
......和......
import React from 'react';
import AlertPanel from './AlertPanel';
export default class SpecialAlertPanel extends React.Component {
constructor(props) {
super(props);
}
render() {
return (
<AlertPanel text="special" />
) ;
}
}
AlertPanel
有一个通过测试:
it( 'should render AlertPanel to a div', function() {
const wrapper = shallow( <AlertPanel /> );
expect( wrapper.type() ).to.eql( 'div' );
});
我认为等效测试适用于SpecialAlertPanel
:
it( 'should render SpecialAlertPanel to a div', function() {
const wrapper = shallow( <SpecialAlertPanel /> );
expect( wrapper.type() ).to.eql( 'div' );
});
但是这个测试失败了:
expected [Function: AlertPanel] to deeply equal 'div'
我的测试或我的代码有错吗?
答案 0 :(得分:2)
由于你做浅渲染,SpecialAlertPanel会渲染到AlertPanel而不是“更深”(http://airbnb.io/enzyme/docs/api/ShallowWrapper/shallow.html)
很可能你需要像
这样的东西it( 'should render SpecialAlertPanel to a div', function() {
const wrapper = shallow( <SpecialAlertPanel /> );
expect(wrapper.find(AlertPanel).shallow().type()).to.eql('div');
});
答案 1 :(得分:1)
来自https://github.com/airbnb/enzyme/blob/master/docs/api/ShallowWrapper/type.md:
如果它是复合组件,那么它将是组件构造函数。
所以SpecialAlertPanel
的包装类型为AlertPanel
。
如果您希望测试通过,请将AlertPanel
包裹在div
。
答案 2 :(得分:0)
与@Igor和@ RemLampa的正确答案略有不同。关于它的另一个观点是 - 你应该为SpecialAlertPanel
测试什么?
使用您显示的示例,您有一个AlertPanel
组件并且已经过测试。
SpecialAlertPanel
唯一的功能是呈现AlertPanel
。
对SpecialAlertPanel
进行<div>
测试是重复AlertPanel
的测试。
如果SpecialAlertPanel
正在呈现AlertPanel
,那么您真正需要进行测试的全部内容。如果AlertPanel
通过了测试,并且SpecialAlertPanel
通过了测试以检查AlertPanel
,那么您已经知道它正在呈现<div>
,而无需明确地测试它。
(如果您将来添加额外功能,当然需要向SpecialAlertPanel
添加测试)