反应& Jest global.confirm不在测试之间更新

时间:2017-04-26 22:40:43

标签: reactjs jestjs enzyme babel-jest

我有一个现有的应用程序,我正在尝试编写测试。我有一个组件函数,它使用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评估为false。如果我将第一个注释掉,那么第二个传递就好了。

我尝试过模仿window.confirm,我得到了完全相同的行为。

1 个答案:

答案 0 :(得分:1)

这是一个明显的问题。我忘了清除NetworkWebAPIUtils.unassignSeat的模拟调用。

afterEach(function () {
    NetworkWebAPIUtils.unassignSeat.mockClear();
});