使用 jest 测试用例在反应中模拟 setInterval 方法

pra*_*n s 6 mocking setinterval reactjs jestjs

我想模拟 setInterval 方法并且应该覆盖 getData 方法中的行。有人可以帮我解决这个问题。

startInterval() {
    setInterval(() => this.getData(), this.state.timeInterval);
}

getData(){
 // i want to covet this lines
}
Run Code Online (Sandbox Code Playgroud)

我试过如下

it('should call getTopIntentsSince', () => {
    jest.useFakeTimers();
    jest.runAllTicks();
})
Run Code Online (Sandbox Code Playgroud)

Bri*_*ams 15

jest.runAllTicks 运行微任务队列中的所有内容。

对于setInterval连续运行的a ,您需要使用jest.advanceTimersByTime.

这是一个简单的例子:

代码.js

import * as React from 'react';

export class MyComponent extends React.Component {

  constructor(...args) {
    super(...args);
    this.state = { calls: 0, timeInterval: 1000 };
    this.startInterval();
  }

  startInterval() {
    setInterval(() => this.getData(), this.state.timeInterval);
  }

  getData() {
    this.setState({ calls: this.state.calls + 1 });
  }

  render() { return null; }
}
Run Code Online (Sandbox Code Playgroud)

代码.test.js

import * as React from 'react';
import { MyComponent } from './code';
import { shallow } from 'enzyme';

test('MyComponent', () => {
  jest.useFakeTimers();
  const component = shallow(<MyComponent/>);
  expect(component.state('calls')).toBe(0);  // Success!
  jest.advanceTimersByTime(3000);
  expect(component.state('calls')).toBe(3);  // Success!
})
Run Code Online (Sandbox Code Playgroud)

如果您取消间隔使其不会连续运行,那么您也可以使用jest.runAllTimers.