Jest + React JS测试组件

时间:2019-02-01 16:04:27

标签: javascript reactjs testing jestjs

我只是熟悉测试,所以有一个小问题。我正在尝试测试更改状态并调用文档功能的组件的功能。在Jest和Enzyme的文档中,我找不到正确的示例。这是示例代码:

class EditableText extends React.PureComponent {
constructor(props) {
    super(props);
    this.state = {
        isEditing: false,
        currentValue: null
    };
    this.textAreaRef = React.createRef();
}
onClick = () => {
    if (!this.state.isEditing) {
        this.setState({ isEditing: true });
        setTimeout(() => {
            this.textAreaRef.current.focus();
        }, 100);
        document.addEventListener('keydown', this.onKeyDown);
        document.addEventListener('click', this.onOutsideClick);
    }
};
onOutsideClick = e => {
    if (e.target.value !== this.state.currentValue) {
        this.closeEditMode();
    }
};
closeEditMode() {
    this.setState({ isEditing: false });
    document.removeEventListener('keydown', this.onKeyDown);
    document.removeEventListener('click', this.onOutsideClick);
}
onKeyDown = e => {
    if (e.code === 'Enter') {
        this.onUpdateValue();
    } else if (e.code === 'Escape') {
        this.closeEditMode();
    }
};
onUpdateValue = () => {
    this.props.onSubmit(this.state.currentValue || this.props.value);
    this.closeEditMode();
};
render() {
    const { isEditing, currentValue } = this.state;
    const { value } = this.props;
    return isEditing ? (
        <TextArea
            className="editable-text__textarea"
            ref={this.textAreaRef}
            onClick={this.onClick}
            value={currentValue === null ? value || '' : currentValue}
            onChange={(_e, { value }) => this.setState({ currentValue: value })}
        />
    ) : (
            <div className="editable-text__readonly" onClick={this.onClick}>
                <div>{this.props.children}</div>
                <div className="editable-text__icon-container">
                    <Icon name="edit" className="editable-text__icon" />
                </div>
            </div>
        );
    }
}

如何测试接收和更改状态并调用document.addEventListener的函数?请帮忙。

更新>我已经编写的测试:

describe('tests of component', () => {
  test('Component renders correctly with isEditing=false', () => {
    const component = renderer
      .create(<EditableText children="I'm text in EditableText" />)
      .toJSON();
    expect(component).toMatchSnapshot();
  });

  test('Component changes to isEditing=true when clicked on it', () => {
    const component = renderer
      .create(<EditableText />);

    let tree = component.toJSON();
    tree.props.onClick();
    tree = component.toJSON();
    expect(tree).toMatchSnapshot();
  });

});

describe('tests of logic', () => {
  test.only('OnClick should change state and add event listeners', ()=> {
    const state = { isEditing: false, currentValue: null }
    global.document.addEventListener = jest.fn();
    EditableText.onClick(() => {
      expect(global.document.addEventListener).toHaveBeenCalled();
    });;
  });
});

0 个答案:

没有答案