таймеры в реакции, синон или шутка - PullRequest
0 голосов
/ 31 мая 2018

У меня есть функция 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)

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

expect(setInterval).toHaveBeenCalledTimes(1)

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

1 Ответ

0 голосов
/ 02 июля 2018

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

setTimeout_spy = jest.spyOn(window, 'setTimeout');
...