Los documentos de Enzyme para Full DOM Rendering aquí contienen el siguiente ejemplo de espionaje en un método de ciclo de vida con Sinon:
describe('<Foo />', () => { it('calls componentDidMount', () => { sinon.spy(Foo.prototype, 'componentDidMount'); const wrapper = mount(<Foo />); expect(Foo.prototype.componentDidMount.calledOnce).to.equal(true); }); });¿Cuál es el equivalente a esto usando funciones simuladas de Jest?
Estoy usando Create-React-App y preferiría no incluir a Sinon si se puede lograr lo mismo con Jest.
Así es como espero que se vea la prueba:
describe('<App />', () => { it('calls componentDidMount', () => { jest.fn(App.prototype, 'componentDidMount'); const wrapper = mount(<App />); expect(App.prototype.componentDidMount.mock.calls.length).toBe(1); }); }); En este caso, App.prototype.componentDidMount no hace referencia a la misma función espía que haría con Sinon.
Los documentos de Jest sobre cómo funcionan realmente las funciones simuladas son un poco limitados. He seguido la discusión aquí sobre lo que está haciendo jest.fn(), pero parece que no es realmente equivalente a sinon.spy().
¿Cómo puedo replicar esa prueba con Jest?
Esto no funcionará con jest de esta manera, ya que jest.fn solo tiene un parámetro para la implementación. Pero lo que es más importante, no debe espiar las partes internas del objeto que desea probar. Debería pensar en Foo como una caja negra donde puede poner algunas propiedades y recuperar algunas cosas. Entonces te das cuenta de que no hay necesidad de probar que las funciones internas de Foo , como componentDidMount , sean llamadas. Lo único que importa es la salida de la caja negra.
Pero si realmente quieres, pruébalo de todos modos:
const spy = jest.fn() const componentDidMount = Foo.prototype.componentDidMount Foo.prototype.componentDidMount = function(){ spy() componentDidMount() }A partir de Jest 19, puedes hacer esto:
describe('<App />', () => { it('calls componentDidMount', () => { const spy = jest.spyOn(App.prototype, 'componentDidMount'); const wrapper = mount(<App />); expect(spy).toHaveBeenCalled(); spy.mockReset(); spy.mockRestore(); }); }); jest.spyOn devuelve una función simulada con todos los métodos normalmente disponibles, como mockClear , mockReset y mockRestore .
Asegúrese de configurar su espía antes de mount con enzima o create con react-test-renderer para que la instancia creada tenga una referencia a la función simulada que se está espiando.