Reactjs 如何测试呈现的React组件的HTML?
具有Reactjs 如何测试呈现的React组件的HTML?,reactjs,jestjs,reactjs-testutils,Reactjs,Jestjs,Reactjs Testutils,具有suggestionRenderer属性,允许指定组件的渲染方式。例如: 功能渲染位置(建议、输入){ 返回( {suggestion.slice(0,input.length)}{suggestion.slice(input.length)} ); } 现在,我想编写一个jest测试来确保suggestionRenderer完成它的工作。检查myElement.getDOMNode().innerHTML会发现: <span data-reactid=".9.1.$sugges
suggestionRenderer
属性,允许指定组件的渲染方式。例如:
功能渲染位置(建议、输入){
返回(
{suggestion.slice(0,input.length)}{suggestion.slice(input.length)}
);
}
现在,我想编写一个jest测试来确保suggestionRenderer
完成它的工作。检查myElement.getDOMNode().innerHTML会发现:
<span data-reactid=".9.1.$suggestion0.0"><strong data-reactid=".9.1.$suggestion0.0.0">M</strong><span data-reactid=".9.1.$suggestion0.0.1">ill Park</span></span>
Mill Park
这并不是特别有用
有没有一种方法可以在没有React属性的情况下获得干净的HTML?您可以使用它
expect(React.renderToStaticMarkup(
<Autosuggest ... suggestionRenderer{renderLocation}/>
))
.to.be('<div>...')
我曾经使用
React.renderComponentToString
并在添加React.renderToStaticMarkup
之前手动删除数据React-
属性。我通常不对HTML进行单元测试(我想如果React的单元测试通过了,那么生成的HTML是好的,另外我打算使用selenium进行集成测试来测试HTML),但是我确实测试了组件是否生成了正确的虚拟DOM
我有一个类似的组件,我测试自动完成项目的方式如下所示
var testAutoCompleteItems = [{
display: 'test 1',
value: 1
}, {
display: 'test 2',
value: 2
}, {
display: 'test 3',
value: 3
}];
//...
it('should set items based on pass getData property', function(done) {
Fiber(function() {
testGlobals.component = React.render(<ExtendText onChange={testHelper.noop} getData={getData} />, div);
var input = TestUtils.findRenderedDOMComponentWithClass(testGlobals.component, 'extend-text__display-input');
TestUtils.Simulate.focus(input);
testHelper.sleep(5);
var autoCompleteContainer = TestUtils.findRenderedDOMComponentWithClass(testGlobals.component, 'extend-text__auto-complete-container');
var autoCompleteItems = TestUtils.scryRenderedDOMComponentsWithTag(autoCompleteContainer, 'li');
//make sure elements are correct
autoCompleteItems.forEach(function(item, key) {
expect(item.props['data-key']).to.equal(key);
expect(item.props.children).to.equal(testAutoCompleteItems[key].display);
});
//make sure there is the correct number of elements
expect(autoCompleteItems.length).to.equal(3);
done();
}).run();
});
var testAutoCompleteItems=[{
显示:“测试1”,
价值:1
}, {
显示:“测试2”,
价值:2
}, {
显示:“测试3”,
价值:3
}];
//...
它('应根据传递getData属性设置项',函数(完成){
光纤(功能(){
testGlobals.component=React.render(,div);
var input=TestUtils.findenderedomcomponentwithclass(testGlobals.component,“extend-text_uudisplay-input”);
TestUtils.Simulate.focus(输入);
睡眠(5);
var autoCompleteContainer=TestUtils.findrenderedomcomponentwithclass(testGlobals.component,“extend-text\uu auto-complete-container”);
var autocompleteetems=TestUtils.scryrenderedomcomponentswithtag(autocompleteecontainer,'li');
//确保元素是正确的
forEach(函数(项、键)的自动完成项{
expect(item.props['data-key'])到.equal(key);
expect(item.props.children).to.equal(testAutoCompleteItems[key].display);
});
//确保元素的数量正确
expect(autoCompleteItems.length).to.equal(3);
完成();
}).run();
});
React.renderToStaticMarkup
获取ReactElement
作为参数,而我有一个ReactComponent
(TestUtils.scryrenderDomComponentSwithClass的结果是ReactComponent
的数组)。知道如何从ReactComponent
获取ReactElement
吗?如果您只想断言呈现了正确的输出,则无需呈现到DOM进行测试:expect(React.renderToStaticMarkup()).to.be(“…”)
-您的组件需要支持将其呈现的任何数据作为道具传递。我要测试的元素呈现为对用户事件的响应(例如,用户类型'm'
)。这就是我将其呈现给DOM的原因。仍然不知道是否有更好的方法手动剥离数据反应-*
属性…使用ReactDOMServer.renderToStaticMarkup
作为react.renderToStaticMarkup.renderToStaticMarkup
是不推荐的。我最终使用了.innerHTML.indexOf
var testAutoCompleteItems = [{
display: 'test 1',
value: 1
}, {
display: 'test 2',
value: 2
}, {
display: 'test 3',
value: 3
}];
//...
it('should set items based on pass getData property', function(done) {
Fiber(function() {
testGlobals.component = React.render(<ExtendText onChange={testHelper.noop} getData={getData} />, div);
var input = TestUtils.findRenderedDOMComponentWithClass(testGlobals.component, 'extend-text__display-input');
TestUtils.Simulate.focus(input);
testHelper.sleep(5);
var autoCompleteContainer = TestUtils.findRenderedDOMComponentWithClass(testGlobals.component, 'extend-text__auto-complete-container');
var autoCompleteItems = TestUtils.scryRenderedDOMComponentsWithTag(autoCompleteContainer, 'li');
//make sure elements are correct
autoCompleteItems.forEach(function(item, key) {
expect(item.props['data-key']).to.equal(key);
expect(item.props.children).to.equal(testAutoCompleteItems[key].display);
});
//make sure there is the correct number of elements
expect(autoCompleteItems.length).to.equal(3);
done();
}).run();
});