working react not event unit-testing reactjs mocha sinon enzyme

unit testing - react - Cómo burlarse de e.preventDefault en el hijo del componente de reacción



preventdefault react (5)

Para aquellos que usan FireEvent de Jest y react-testing-library , debe proporcionar un objeto de evento inicializado, de lo contrario, el evento no se puede enviar a través de su elemento.

Entonces se puede afirmar que se llama a e.preventDefault asignando una propiedad a ese evento inicializado:

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(event.preventDefault).toHaveBeenCalledTimes(1); });

Del mismo modo para stopPropagation .

La respuesta de Anton Karpenko para Jest fue útil.

Realmente no sé cómo simular una función en línea en el hijo del componente de reacción

Mi pila: sinon , chai , enzyme ;

Uso de componentes:

<ListItem onClick={() => someFn()} />

Procesamiento del componente:

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

Aquí tenemos onClick que llama a e.preventDefault() . ¿Cómo saber si <a href> ( link ) no llama a e.preventDefault() ? ¿Cómo puedo burlarme de que onClick ?

A continuación lo que he probado en las pruebas:

Configuración de copia superficial

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''), } }

Y la prueba

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() });

Error de salida de la prueba:

TypeError: Cannot read property ''preventDefault'' of undefined


Prueba esto

link.simulate(''click'', { preventDefault: () => { } });


Solo para tener en cuenta que esto es un problema solo cuando se utiliza shallow procesador de enzimas shallow . En el caso de un mount procesador DOM completo, el objeto de evento contiene el método preventDefault , por lo que no tiene que burlarse de él.


Sugeriría crear un nuevo objeto basado en jest.fn () con

const event = Object.assign(jest.fn(), {preventDefault: () => {}})

entonces úsalo:

element.simulate(''click'', event);


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(); });