2017-04-26 39 views
0

我有一個現有的應用程序,我正在爲其編寫測試。我有一個使用window.confirm框來獲取這樣的用戶輸入(不是我的代碼)的組件功能:React&Jest global.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

這是一個明顯的問題。我忘了清除來自NetworkWebAPIUtils.unassignSeat的模擬呼叫。

afterEach(function() { 
    NetworkWebAPIUtils.unassignSeat.mockClear(); 
}); 
相關問題