如何测试React with Enzyme中子组件回调调用的组件回调?

时间:2017-01-26 00:22:33

标签: unit-testing reactjs callback jestjs enzyme

说我有以下申请:

class Child extends React.Component {
    render() {
        return <button onClick={this.handleChildOnClick}>{this.props.children}</button>;
    }

    handleChildOnClick() {
        this.props.onChildClick('foo');
    }
}

class Parent extends React.Component {
    render() {
        return <Child onChildClick={this.handleParentOnClick}>click me</Child>;
    }

    handleParentOnClick(text) {
        this.props.onParentClick(12345);
    }
}

class App extends React.Component {
    render() {
        return <Parent onParentClick={(num) => console.log(num)} />;
    }
}

我很难找到测试Parent组件的正确方法。 ChildApp一个不是问题,但Parent ...

我的意思是,如何测试Child组件上的点击是否会调用Parent点击回调而不:

  1. ...渲染ChildParent应该作为浅层渲染单独测试。 Child也将被隔离测试,如果我进行了渲染渲染,我基本上是在Child上测试点击回调两次。
  2. ...直接在handleParentOnClick实例上调用Parent。我不应该依赖于Parent的确切实现。如果我更改回调函数的名称,测试将会中断,这很可能是误报。
  3. 有第三种选择吗?

2 个答案:

答案 0 :(得分:13)

在测试Parent时,您可以执行以下操作:

import { shallow } from 'enzyme';
import { stub } from 'sinon';

describe('<Parent/>', () => {
  it('should handle a child click', () => {
    const onParentClick = stub();
    const wrapper = shallow(<Parent onParentClick={onParentClick} />);
    wrapper.find("Child").prop('onChildClick')('foo');
    expect(onParentClick.callCount).to.be.equal(1);
    // You can also check if the 'foo' argument was passed to onParentClick
  });
});

答案 1 :(得分:0)

我认为这可以给你一些想法。

//组件

import { spy, stub } from 'sinon';
import { shallow } from 'enzyme';

describe('Child Component', () => {
  it('should check handle click', () => {
    spy(Child.prototype, 'handleChildOnClick');
    const onChildClick = stub();
    const wrapper = shallow(<Child onChildClick={onChildClick}>);
    wrapper.find(".t-btn").simulate('click');
    expect(Child.prototype.handleChildOnClick.callCount).to.equal(1);
  });

  it('should check onChildClick', () => {
    const onChildClick = stub();
    const wrapper = shallow(<Child onChildClick={onChildClick}>);
    wrapper.find(".t-btn").simulate('click');
    expect(onChildClick.callCount).to.equal(1);
  });
});

//测试

import { stub } from 'sinon';
import { shallow } from 'enzyme';
import Child from '../Components/Child';

describe('Parent Component', () => {
  it('should check handle click', () => {
    const onParentClick = stub();
    const wrapper = shallow(<Parent onParentClick={onParentClick} />);
    wrapper.find(".t-btn").simulate('click');
    expect(Child.prototype.handleChildOnClick.callCount).to.equal(1);
  });

  it('should check onChildClick', () => {
    const onChildClick = stub();
    const wrapper = shallow(<Child onChildClick={onChildClick}>);
    wrapper.find(Child).prop('onChildClick')('foo');
    expect(onParentClick.callCount).to.be.equal(1);
  });
});

使用子组件测试父级

routerLinkActiveOptions

上面的代码只处理一个组件,但我希望这可以给你一些要点。对不起,如果语法在任何地方破坏..