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();
});