Pregunta Cómo espiar componentWillMount usando broma y enzima


Estoy tratando de probar si se llamó a componentWillMount y para eso mi prueba es

test('calls `componentWillMount` before rendering', () => {
  let fn = jest.fn(SomeComponent.prototype.componentWillMount)
  mount(<SomeComponent />)
  expect(fn).toHaveBeenCalled()
})

Pero a pesar de que se llama al método componentWillMount, la prueba no pasa. ¿Que me estoy perdiendo aqui?


8
2018-01-11 18:54


origen


Respuestas:


No sé si las otras respuestas han ayudado con su pregunta, pero no debería necesitar probar componentWillMount. React debería hacer esa prueba por ti.

Más relevante para su prueba sería probar las funciones o acciones que está implementando en ese método para su componente.

Si está realizando alguna llamada a la API, ejecutando una función basada en accesorios, o cualquier otra cosa, eso es lo que debería probar. Simula la función / acción / código que componentWillMount desencadena y hace afirmaciones y expectativas sobre eso.

Ejemplo:

Componente:

class YourComponent extends Component {

  componentWillMount() {
    /*this fetch function is actually what you want to test*/
    this.props.fetch('data')
  }

  render() {
    /* whatever your component renders*/ 
  }    
}

Pruebas:

test('should call fetch when mounted', () => {
  let mockFetch = jest.fn()

  const wrapper = mount(<SomeComponent fetch={mockFetch}/>);

  expect(wrapper).toBeDefined();
  expect(mockFetch).toHaveBeenCalled();
  expect(mockFetch.mock.calls[0]).toEqual(['data'])
});

14
2018-03-29 17:04



Yo primero spy en el componente componentWillMount método, sino también el uso .and.CallThrough() para evitar que se burle de su contenido. Espero que esto ayude:

it('should check that the componentWillMount method is getting called', () => {
    spyOn(SomeComponent.prototype, 'componentWillMount').and.callThrough();

    const wrapper = mount(<SomeComponent />);

    expect(wrapper).toBeDefined();
    expect(SomeComponent.prototype.componentWillMount).toHaveBeenCalledTimes(1);
});

2
2018-01-15 00:29



Prueba esto:

test('calls `componentWillMount` before rendering', () => {
  const onWillMount = jest.fn();
  SomeComponent.prototype.componentWillMount = onWillMount;
  mount(<SomeComponent />);

  expect(onWillMount).toBeCalled();
});

1
2018-02-02 12:27



No creo que la respuesta anterior aborde el problema. Que es broma le permite espiar un método pero no le permite callThrough mientras espías en su estado de llamada. La solución que mejor funcionó para mí es configurar la prueba con un componente que tiene componentWillMount definido. Apoyarse en la broma solo complicará las cosas.

describe('componentWillMount', () => {
  const calls = []
  class Component1 extends Components {
    componentWillMount() {
      calls.push(new Date)
    }
    render() { ... }
  }
  
  afterEach(() => calls.splice(0, calls.length))
  it('has been called', () => {
    mount(<Component1 />)
    expect(calls.length).toBe(1)
  })
})


0
2017-07-14 16:36