Mam istniejącą aplikację, dla której próbuję napisać testy. Mam funkcję komponentu, która korzysta z okna.confirm, aby uzyskać dane wejściowe użytkownika (nie mój kod):
if (window.confirm("Are you sure to unassign?")) {
NetworkWebAPIUtils.unassignSeat(this.state.seatnetwork.seat.id, this.state.seatnetwork.network.id, this.props.rank);
}
Próbuję napisać testy dla obu ścieżek:
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();
});
Problem polega na tym, że global.confirm nie zaktualizuje się do drugiego testu. Jeśli ustawię pierwszy test na false
wtedy oczywiście się nie udaje, ale drugi mija. Jeśli ustawię pierwszy na true
wtedy pierwszy przechodzi, ale drugi kończy się niepowodzeniem, ponieważ global.confirm = jest.fn(() => false)
tak naprawdę nie powoduje, że window.confirm ma wartość false. Jeśli skomentuję pierwszy, drugi przejdzie dobrze.
Próbowałem wyśmiać Window.confirm i otrzymuję dokładnie to samo zachowanie.
Odpowiedzi:
1 dla odpowiedzi № 1To był oczywisty problem. Zapomniałem usunąć próbne połączenia z NetworkWebAPIUtils.unassignSeat.
afterEach(function () {
NetworkWebAPIUtils.unassignSeat.mockClear();
});