【问题标题】:What's wrong with my Enzyme/Mocha test?我的酶/摩卡测试出了什么问题?
【发布时间】:2016-05-12 21:13:58
【问题描述】:

反应组件:

import React, { Component, PropTypes } from 'react';

export default class Simple extends Component {
  render() {
    return <div className="Simple">
      Result: {this.props.value * 4}
    </div>
  }
}

Simple.propTypes = {
  value: PropTypes.number,
};

测试:

describe('<Simple />', _ => {
  it('should display', done => {
    const wrapper = shallow(<Simple />);

    expect(wrapper.find('div.Simple')).to.have.length(1);
    done();
  });

  it('should quadruple a value passed into it', done => {
    const wrapper = shallow(<Simple value={3} />);

    expect(wrapper.contains(<div className="Simple">Result: 12</div>)).to.equal(true);
    done();
  })
});

第一个测试通过,第二个(四倍一个值)失败。我无法弄清楚我在这里做错了什么。

编辑:

如果我修改组件只返回这个:

return <div className="Simple">
  Result:
</div>

测试如下:

expect(wrapper.contains(
  <div className="Simple">
    Result:
  </div>
)).to.equal(true);

然后它通过了。所以当我引入计算道具时,测试失败了。我不太清楚为什么。

【问题讨论】:

  • 你需要在第二个结尾加分号吗?
  • 不,这绝对不是问题。
  • 我们可以看到ReactDOM.render(&lt;HelloMessage value=22 /&gt;, mountNode); 我对节点有点陌生所以我正在寻找这里定义的执行工作流::facebook.github.io/react
  • 我保证这也不是问题。我可以在页面上看到组件渲染。无论如何显示代码也无济于事.. 它不是标准的 React。
  • 我想知道是否需要使用render 而不是shallow?然后expect(wrapper.text()).to.equal('Result: 12')

标签: reactjs mocha.js enzyme


【解决方案1】:

这行得通:

  it('should quadruple a value passed into it', done => {
    const wrapper = shallow(<Simple value={3} />);

    expect(wrapper.contains(<div className="Simple">Result: {12}</div>)).to.equal(true);
    done();
  })

这是因为 div 中有两个子元素。如果你使用console.log(wrapper.find('div').childAt(1).text()),你可以看到这个给你12。

shallow 基本上是来自react-addons-test-utils 的浅层渲染器的包装器。它的作用是执行您的组件渲染方法并返回结果反应元素。在这种情况下,react 将创建两个元素,一个用于Result:,一个用于12。 Dan Abramov 有一个 excellent post,它准确地描述了一个 react 元素。

在无效的测试中,您正在寻找一个具有一个文本节点的 div,但呈现的是一个具有两个文本节点的 div。通过将 12 放在花括号中,您已将其强制放入新的文本节点

【讨论】:

  • 成功了!我想这是有道理的,因为12 是数字并且在技术上是 JavaScript ......?
  • 我认为原因是 div 有两个孩子。在 DOM 中,div 内的文本是一个文本节点。一个元素中可以有多个文本节点。在您没有工作的测试中,您正在寻找一个具有一个文本节点的 div,但呈现的是一个具有两个文本节点的 div。通过将 12 放在花括号中,您已将其强制放入新的文本节点
  • 明白了。此外,使用render 代替shallow,然后查找"Result: 12" 也可以解决问题。
  • 是的 render 呈现为 html 字符串,因此节点概念消失了。 shallow 基本上是来自react-addons-test-utils 的浅层渲染器的包装器。它的作用是执行您的组件渲染方法并返回结果反应元素。在这种情况下,react 会创建两个元素,一个用于Result:,一个用于12
  • 这是一本了解 React 元素的优秀读物:facebook.github.io/react/blog/2015/12/18/…
猜你喜欢
  • 2014-07-28
  • 1970-01-01
  • 1970-01-01
  • 2019-02-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-04
  • 2016-09-19
相关资源
最近更新 更多