如何在反应组件的子代中模拟e.preventDefault

Ser*_*lov 32 unit-testing mocha.js sinon reactjs enzyme

我真的不知道如何在react组件的子代中模拟内联函数

我栈:sinon,chai,enzyme,

组件用法:

<ListItem onClick={() => someFn()} />
Run Code Online (Sandbox Code Playgroud)

组件的渲染:

render() {
    return (
      <li>
        <a href="#" onClick={e => {
            e.preventDefault();
            this.props.onClick();
          }}
        > whatever </a>
      </li>
    );
  }
Run Code Online (Sandbox Code Playgroud)

我们在这里onClick打电话e.preventDefault().如何告诉<a href>(link)不要打电话e.preventDefault()?我怎么能嘲笑那个onClick

以下我在测试中尝试:

浅拷贝设置

function setup() {
  const someFn = sinon.stub();

  const component = shallow(
    <ListItem
      onClick={() => {
        someFn();
      }}
    />
  );

  return {
    component: component,
    actions: someFn,
    link: component.find('a'),
    listItem: component.find('li'),
  }
}
Run Code Online (Sandbox Code Playgroud)

而且测试

  it('simulates click events', () => {
    const { link, actions } = setup();
    link.simulate('click'); //Click on <a href>
    expect(actions).to.have.property('callCount', 1); //would be good if we'll remove e.preventDefault()
  });
Run Code Online (Sandbox Code Playgroud)

测试的输出错误:

TypeError: Cannot read property 'preventDefault' of undefined
Run Code Online (Sandbox Code Playgroud)

Wit*_*ult 80

试试这个

link.simulate('click', {
  preventDefault: () => {
  }
 });
Run Code Online (Sandbox Code Playgroud)


小智 7

 test('simulates click events', () => {
    const e = { stopPropagation: jest.fn() };
    const component = shallow(<ListItem{...props} />);
    const li = component.find('li').at(0).childAt(0)
    li.props().onClick(e)

    expect();
  });
Run Code Online (Sandbox Code Playgroud)


Mat*_*ava 6

请注意,这仅是使用shallow酶渲染器时的问题。在完整的 DOM 渲染器的情况下mount,事件对象包含该preventDefault方法,因此您不必模拟它。


Lar*_*rry 6

对于那些使用 Jest 和@testing-libraryreact-testing-librarys 的人fireEvent,您需要提供一个初始化的事件对象,否则无法通过您的元素调度该事件。

然后可以e.preventDefault通过为该初始化事件分配一个属性来断言被调用:

test('prevents default on click', () => {
  const {getByText} = render(<MyComponent />);
  const button = getByText(/click me/);

  // initialise an event, and assign your own preventDefault
  const clickEvent = new MouseEvent('click');
  Object.assign(clickEvent, {preventDefault: jest.fn()});

  fireEvent(button, clickEvent);

  expect(clickEvent.preventDefault).toHaveBeenCalledTimes(1);
});
Run Code Online (Sandbox Code Playgroud)

对于stopPropagation.

Anton Karpenko对 Jest的回答很有用。