【问题标题】:Enzyme returns null for prop on shallow rendered react component酶在浅渲染的反应组件上为 prop 返回 null
【发布时间】:2016-08-31 21:47:12
【问题描述】:

问题

我刚刚开始进行酶和反应测试。我试图让酶在一个微不足道的反应组件上与业力和 webpack 一起工作。我的问题是包装器上的 prop() 返回 null 我不知道为什么。

Greeter.js

import React from 'react';

/*
 * A trivial component we added while trying to get the react testing  working
 * */

export default class Greeter extends React.Component {
constructor(props) {
    super(props);
    this.state = { name: props.initialName };

    this.greeterText = this.greeterText.bind(this);
}

greeterText() {
    return (<p>Hello, {this.state.name}!</p>);
}

render() {
    return (<div className="greeter">
        {this.greeterText()}
    </div>);
  }
}

Greeter.defaultProps = { initialName: "World" };

Greeter.propTypes = {
  initialName: React.PropTypes.string
};

greeter.spec.js

import Greeter from '../../components/test/Greeter';
import React from 'react';
import { shallow } from 'enzyme';


describe("Simple testing with shallow rendering", () => {
  beforeEach(function() {
    let initialName = "joe";
    this.wrapper = shallow(<Greeter initialName={initialName} />);
  });

  it("renders default Greeter", function() {
    console.log(this.wrapper.find(".greeter").text());
    console.log(this.wrapper.debug());
    console.log(this.wrapper.state('name'));
    expect(this.wrapper.state('name')).to.equal("joe");
    expect(this.wrapper.prop('initialName')).to.equal("joe");
   });
 });

结果

浅渲染的简单测试 × 呈现默认的 Greeter 铬 50.0.2661 (Windows 10 0.0.0) AssertionError:预期未定义等于“乔” 在 Assertion.assertEqual >>(F:/web/forms/node_modules/chai/chai.js:776:12) 在 Assertion.ctx.(anonymous function) [as equal] (F:web/forms/node_modules/chai/chai.js:4192:25) 在上下文。 (F:web/forms/spec/components/greeter.spec.js:9:2932

堆栈

  • 反应 0.14.8
  • 业力
  • 网页包
  • 酶 2.2.0

【问题讨论】:

  • 第一次记录状态时会显示什么?
  • 日志:“你好,乔!”日志:“你好,乔!”日志:'

    你好,乔!

    ' LOG: '

    你好,乔!

    日志:'

    你好,乔!

    ' 日志:'joe' 日志:'joe'`

标签: javascript reactjs enzyme


【解决方案1】:

我相信您正在寻找的是 wrapper.instance().props.nameOfProp 来访问浅包装器的根节点道具。

从概念上讲,假设您有一个组件在挂载时有条件地运行 Function prop。这当然值得检查,对吧?

【讨论】:

    【解决方案2】:

    如果您想像这样测试传入的道具,请使用mount,如下所示:

      it('allows us to set props', () => {
        const wrapper = mount(<Foo bar="baz" />);
        expect(wrapper.props().bar).to.equal("baz");
        wrapper.setProps({ bar: "foo" });
        expect(wrapper.props().bar).to.equal("foo");
      });
    

    【讨论】:

    • 谢谢!这确实对我有用。什么场景下可以用 shallow 检查 props?我很困惑为什么他们在文档中包含 props 调用而不限定其用法......
    • 检查传递给子元素的props,而不是传递给组件本身的props。为什么你还需要知道这些?你自己传递了它们,所以你当然知道它们是什么?
    • shallow 调用您的反应组件的渲染方法,它的 api 允许您查询生成的反应元素。为了更深入地理解这一点,这是一本好书:facebook.github.io/react/blog/2015/12/18/…
    • @JackAllan 我做了.setProps 有点需要知道当前的道具是什么。这可能吗?
    • @JackAllan 的一个用途可能是安装在闭包中创建的组件并尝试检查绑定到它的 prop 值是什么
    猜你喜欢
    • 2018-07-14
    • 2015-11-23
    • 1970-01-01
    • 1970-01-01
    • 2019-05-16
    • 1970-01-01
    • 2018-04-03
    • 2018-09-25
    • 1970-01-01
    相关资源
    最近更新 更多