vida react qué que podemos optimizar nuestros método los example errores desmontar con componentwillmount componentes componente componentdidmount ciclo capturar javascript reactjs testing jestjs enzyme

javascript - react - ¿con qué método del ciclo de vida podemos capturar errores en nuestros componentes?



Uso de Jest para espiar la llamada de método en componentDidMount (2)

Recientemente quise probar que algún método personalizado se llama condicionalmente en el método componentDidMount de un componente React.

componentDidMount() { if (this.props.initOpen) { this.methodName(); } }

Estoy usando Jest como mi marco de prueba, que incluye jest.fn() para jest.fn() / espías. He leído que esto sería bastante trivial para probar con Sinon, haciendo algo como lo siguiente:

sinon.spy(Component.prototype, "methodName"); const wrapper = mount(<Component {...props} />); expect(wrapper.instance().methodName).toHaveBeenCalled();

Estoy tratando de recrear esto con Jest de esta manera:

Component.prototype.methodName = jest.fn(); const wrapper = mount(<Component {...props} />); expect(wrapper.instance().methodName).toHaveBeenCalled();

Este código falla y lanza el siguiente error:

jest.fn() value must be a mock function or spy. Received: function: [Function bound mockConstructor]

¿Es posible probar esta funcionalidad con Jest? Y si es así, ¿cómo?


La clave es usar el método spyOn . Debería ser así:

const spy = jest.spyOn(Component.prototype, ''methodName''); const wrapper = mount(<Component {...props} />); wrapper.instance().methodName(); expect(spy).toHaveBeenCalled();

Como se encuentra aquí, por ejemplo: Probar si la función se llama reaccionar y enzima

Tenga en cuenta que también es una buena práctica borrar la función espiada después de cada ejecución de prueba

let spy afterEach(() => { spy.mockClear() })

https://facebook.github.io/jest/docs/en/jest-object.html#jestclearallmocks


Sé que es un poco tarde, pero encontré esto y sugeriría que para probar componentDidMount inicie la llamada a su método anidado para que su prueba se vea algo como:

Módulo

componentDidMount() { if (this.props.initOpen) { this.methodName(); } }

Prueba - buena

it(''should call methodName during componentDidMount'', () => { const methodNameFake = jest.spyOn(MyComponent.prototype, ''methodName''); const wrapper = mount(<MyComponent {...props} />); expect(methodNameFake).toHaveBeenCalledTimes(1); });

Si llama a componentDidMount , su afirmación de que methodName fue llamado a través de componentDidMount es más válida.

Prueba - malo

it(''should call methodName during componentDidMount'', () => { const spy = jest.spyOn(Component.prototype, ''methodName''); const wrapper = mount(<Component {...props} />); wrapper.instance().methodName(); expect(spy).toHaveBeenCalled(); }

Al escribir la prueba de esta manera, usted llama al método y luego afirma que fue llamado. Lo que por supuesto te habrá dado acaba de llamarlo.