使用Jest测试React元素高度

时间:2015-02-07 22:01:45

标签: reactjs reactjs-testutils

我有一个非常简单的React.js组件,用&#34来装饰一长串标记;阅读更多" /"阅读更少"功能。

我和Jest一起做了一些测试, 但是,我无法断言DOM元素高度增加到原始内容的大小。

在Jest测试环境中,我对getDOMNode()。scrollHeight的调用似乎没有返回任何内容。

以下是使用代码和失败测试的存储库链接:https://github.com/mguterl/react-jest-dom-question

以下是代码和测试的简化版本,说明了同样的问题:

简化代码

var ReadMore = React.createClass({
  getInitialState: function() {
    return {
      style: {
        height: '0px'
      }
    }
  },

  render: function() {
    return (
      <div>
        <div ref='content' className='read-more__content' style={this.state.style} dangerouslySetInnerHTML={{__html: this.props.content}} />
        <a onClick={this.expand} href='#'>Expand</a>
      </div>
    );
  },

  expand: function() {
    // This call to scrollHeight doesn't return anything when testing.
    var height = this.refs.content.getDOMNode().scrollHeight;

    this.setState({
      style: {
        height: height
      }
    });
  }
});

测试

jest.dontMock('../ReadMore');

global.React = require('react/addons');
var TestUtils = React.addons.TestUtils;
var ReadMore = require('../ReadMore');

describe('ReadMore', function() {
  var readMore;
  var content;
  var link;

  beforeEach(function() {
    readMore = TestUtils.renderIntoDocument(
      <ReadMore collapsedHeight='0px' content='<p>Hello World</p>' />
    );

    content = TestUtils.findRenderedDOMComponentWithClass(
      readMore, 'read-more__content');

    link = TestUtils.findRenderedDOMComponentWithTag(
      readMore, 'a');
  });

  it('starts off collapsed', function() {
    expect(content.getDOMNode().getAttribute('style')).toEqual('height:0px;');
  });

  it('expands the height to fit the content', function() {
    TestUtils.Simulate.click(link);
    expect(content.getDOMNode().getAttribute('style')).toEqual('height:100px;');
  });
});

1 个答案:

答案 0 :(得分:1)

Jest&#34;使用假的DOM实现(通过jsdom)运行您的测试,以便您的测试可以在命令行上运行&#34; (http://facebook.github.io/jest/)。

我不希望设置像元素高度这样的东西,因为它不是针对渲染引擎运行来计算任何div的高度。

我建议在div中设置一个标记样式类,无论是两个状态还是两个(&#34; read-more&#34; /&#34; read-less&#34;)。然后你的测试可以断言是否存在类。

另外 - 如果您未在&#34中设置样式属性,请阅读更多&#34;模式,应该渲染封闭的div以完全显示内部div(除非您不仅仅是尝试显示整个内部div)。因此,测试样式属性在&#34中的this.props.collapsedHeight值是否足够?阅读更少&#34;模式,并未设置在&#34;阅读更多&#34;模式?