反应儿童渲染道具单元测试

时间:2021-03-10 23:06:05

标签: reactjs unit-testing enzyme

我有两个组件,一个是Parent,另一个是作为renderProp传递的Kid

export class Kid extends Component {
  render() {
    const { age, name } = this.props;
    return (
      <div className="kid">
        <span className="age">age: {age}</span>, name: {name}
      </div>
    );
  }
}

export class Parent extends Component {
  state = {
    age: 20,
    name: "the name"
  };
  render() {
    return (
      <div>
        {this.props.children({ age: this.state.age, name: this.state.name })}
      </div>
    );
  }
}

export default function App() {
  return (
    <div className="parent">
      <Parent>{({ age, name }) => <Kid age={age} name={name} />}</Parent>
    </div>
  );
}

如何通过单元测试确保 Kid 具有正确的道具

describe("<App />", () => {
  it("Should render Kid", () => {
    const wrapper = shallow(<App />);
    console.log(wrapper.debug());

    // pass
    expect(wrapper.find(Parent).exists()).toBe(true);

    // fails
    expect(wrapper.find(Kid).exists()).toBe(true);
    expect(wrapper.find(Parent).children().find(Kid).exists()).toBe(true);

    // fails
    const kid1 = wrapper
      .find(Parent)
      .renderProp("children", { age: 5, name: "a" });
    expect(kid1.prop("age")).toEqual(5);
    expect(kid1.hasClass("kid")).toBe(true);

    // fails
    const kid2 = wrapper.find(Parent).prop("children")({ age: 5, name: "a" });
    expect(kid2.prop("age")).toEqual(5);
  });
});


这是沙盒示例 https://codesandbox.io/s/jest-test-children-function-hcvzz?file=/src/App.test.js:0-884

1 个答案:

答案 0 :(得分:0)

前两个测试失败,因为您没有在此处使用 renderProp。后两个测试失败,因为 renderProp (docs) 接受一个 prop 名称并返回一个接受 render-prop 参数的函数,因此您需要在单独的函数应用程序中传递该对象:< /p>

const kid1 = wrapper.find(Parent).renderProp("children")({ age: 5, name: "a" });

kid1.hasClass("kid") 上的测试仍然会失败,因为 Kid 本身实际上并未呈现,因为您使用的是 shallow。如果将 kid2 替换为 .prop("children")renderProp("children") 上的测试将通过,但它与 kid1 相同。

CodeSandbox