如何使用玩笑监视 setState 并测试 toHaveBeenCalled()

Mat*_*ood 3 reactjs jestjs

使用 Jest 和 React,我如何监视this.setState()并测试该功能hasBeenCalled()

it('shall update targets when engine register has been called', () => 
{
  const wrapper = shallow(
    <LazyloadProvider>
      <p>Wow</p>
    </LazyloadProvider>
  ).instance();
  expect(wrapper.state.targets).toEqual({}); // pass
  wrapper.engine.register(FIXTURE.REACT_REF); // pass
  expect(wrapper.state.targets).not.toEqual({}); //pass
  expect(wrapper.setState).toHaveBeenCalled(); // fail
});
Run Code Online (Sandbox Code Playgroud)

发动机吸气剂:

  get engine() {
    return {
      state: this.state,
      register: target => {
        this.setState(LazyloadUtils.registerOneTarget(target));
      },
    };
  }
Run Code Online (Sandbox Code Playgroud)

小智 9

理想情况下,您需要检查 setState 方法正在更新的 state 对象中的键

expect(wrapper.state('foo')).toEqual('bar')
Run Code Online (Sandbox Code Playgroud)

如果你真的想窥探方法本身,你可以在组件原型上模拟 setState 方法。您需要在创建组件的浅表副本之前执行此操作。

it('shall update targets when engine register has been called', () => 
 {
   LazyloadProvider.prototype.setState = jest.fn();
   const wrapper = shallow(
      <LazyloadProvider>
        <p>Wow</p>
      </LazyloadProvider>
    ).instance();
   expect(wrapper.setState).toHaveBeenCalled();
 }
Run Code Online (Sandbox Code Playgroud)