Имам едно съществуващо приложение, за което се опитвам да напиша тестове. Имам компонент функция, която използва window.confirm поле, за да получите вход на потребителя (не ми код), като този:
if (window.confirm("Are you sure to unassign?")) {
NetworkWebAPIUtils.unassignSeat(this.state.seatnetwork.seat.id, this.state.seatnetwork.network.id, this.props.rank);
}
Опитвам се да напиша тестове за двата пътеки:
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();
});
Проблемът е, че global.confirm няма да се актуализира за втория тест. Ако задам първия тест false
тогава очевидно не успее, но втората минава. Ако задам първото true
тогава първото преминава, но втората не успее, защото global.confirm = jest.fn(() => false)
всъщност не причинява window.confirm, за да прецени, че е фалшив. Ако коментирам първото, то второто минава добре.
Опитах да подигравам window.confirm и получавам точно същото поведение.
Отговори:
1 за отговор № 1Това беше очевиден проблем. Забравих да изчистя подигравките обаждания от NetworkWebAPIUtils.unassignSeat.
afterEach(function () {
NetworkWebAPIUtils.unassignSeat.mockClear();
});