тестовые таймеры в реакции, синоне или шутке

У меня есть функция checkIdleTime, которую нужно периодически вызывать.

componentDidMount() {
    var idleCheck = setInterval(this.checkIdleTime.bind(this), authTimeoutSeconds * 1000);
    this.setState({idleCheck: idleCheck});

    document.onkeypress = this.setActive;
}

Я хочу использовать фальшивый таймер для теста, но не могу понять, как это сделать, попробовал sinon и jest.

beforeEach(() => {   
    checkIdleTime = jest.spyOn(PureMain.prototype, 'checkIdleTime');
    wrapper = shallow(
        <PureMain/>
    );

    jest.useFakeTimers();
    //clock = sinon.useFakeTimers();  
});

it('should check the idle time after [authTimeoutSeconds] seconds of inactivity', () => {

    wrapper.instance().componentDidMount();

    var idleCheck_timeout = wrapper.instance().state.idleCheck;
    expect(idleCheck_timeout).not.toEqual(null);
    expect(idleCheck_timeout._idleTimeout).toBe(authTimeoutSeconds * 1000);
    jest.runAllTimers();
    //clock.tick(authTimeoutSeconds * 1000 * 2);
    expect(setInterval).toHaveBeenCalledTimes(1);//not work
    expect(checkIdleTime).toHaveBeenCalledTimes(1);//not work
})

Получил ошибку:

Ожидается, что фиктивная функция будет вызываться один раз, но она вызывалась ноль раз.

Я пытался следовать этим примерам

https://facebook.github.io/jest/docs/en/timer-mocks.html

http://sinonjs.org/releases/v1.17.7/fake-timers/ < / а>


Не могу найти хороший пример того, как шпионить за setInterval

expect(setInterval.mock.calls.length).toBe(1)

Невозможно прочитать вызовы свойств undefined

expect(setInterval).toHaveBeenCalledTimes(1)

значение должно быть фиктивной функцией или шпионом.


person Miranda    schedule 31.05.2018    source источник
comment
Какую версию sinon вы используете?   -  person maazadeeb    schedule 31.05.2018
comment
думаю это синон 4.1.2   -  person Miranda    schedule 31.05.2018
comment
Кроме того, какая ошибка возникает при использовании sinon?   -  person maazadeeb    schedule 31.05.2018
comment
Я получил одно и то же сообщение об ошибке для обоих. со шпионом что-то не так?   -  person Miranda    schedule 31.05.2018
comment
Я так думаю. Можете ли вы подтвердить, что expect(setInterval).toHaveBeenCalledTimes(1) и expect(checkIdleTime).toHaveBeenCalledTimes(1) не работают по отдельности? Например, закомментируйте первую строку и попробуйте, а затем закомментируйте вторую строку и попробуйте.   -  person maazadeeb    schedule 31.05.2018
comment
не работает отдельно, кроме того, я не ожидаю, что setInterval будет работать ...   -  person Miranda    schedule 04.06.2018


Ответы (1)


Оказалось, что шпион должен быть объявлен как:

setTimeout_spy = jest.spyOn(window, 'setTimeout');
person Miranda    schedule 02.07.2018