Tengo una aplicación existente para la que estoy intentando escribir pruebas. Tengo una función de componente que utiliza un cuadro de confirmación de ventana para obtener la entrada del usuario (no mi código) como esta:
if (window.confirm("Are you sure to unassign?")) {
NetworkWebAPIUtils.unassignSeat(this.state.seatnetwork.seat.id, this.state.seatnetwork.network.id, this.props.rank);
}
Estoy tratando de escribir pruebas para ambos caminos:
it("should call endpoint when user selects yes", function () {
global.confirm = jest.fn(() => true);
seatUpdateRow.instance().handleChangeAssigned({target: {value: true}});
expect(NetworkWebAPIUtils.unassignSeat.mock.calls.length).toBe(1);
expect(NetworkWebAPIUtils.unassignSeat.mock.calls[0].length).toBe(3);
expect(NetworkWebAPIUtils.unassignSeat.mock.calls[0][0]).toBe(1234);
expect(NetworkWebAPIUtils.unassignSeat.mock.calls[0][1]).toBe(5678);
expect(NetworkWebAPIUtils.unassignSeat.mock.calls[0][2]).toBe(1);
});
it("should not call endpoint when user selects no", function () {
global.confirm = jest.fn(() => false);
seatUpdateRow.instance().handleChangeAssigned({target: {value: true}});
expect(NetworkWebAPIUtils.unassignSeat).not.toHaveBeenCalled();
});
El problema es que global.confirm no se actualizará para la segunda prueba. Si configuro la primera prueba para false
entonces obviamente falla pero la segunda pasa. Si configuro el primero en true
entonces el primero pasa pero el segundo falla porque global.confirm = jest.fn(() => false)
en realidad no causa que window.confirm evalúe como falso. Si comento el primero, entonces el segundo pasa muy bien.
He intentado burlarse de window.confirm y obtengo exactamente el mismo comportamiento.
Respuestas
1 para la respuesta № 1Era un problema obvio. Olvidé borrar las llamadas simuladas de NetworkWebAPIUtils.unassignSeat.
afterEach(function () {
NetworkWebAPIUtils.unassignSeat.mockClear();
});