代码之家  ›  专栏  ›  技术社区  ›  Armeen Moon

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

  •  1
  • Armeen Moon  · 技术社区  · 7 年前

    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
    });
    

      get engine() {
        return {
          state: this.state,
          register: target => {
            this.setState(LazyloadUtils.registerOneTarget(target));
          },
        };
      }
    
    2 回复  |  直到 7 年前
        1
  •  8
  •   Pranita    7 年前

    理想情况下,您应该检查setState方法正在更新的key-in-state对象

    expect(wrapper.state('foo')).toEqual('bar')
    

    如果您真的想监视方法本身,可以在组件原型上模拟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();
     }
    
        2
  •  1
  •   mlg87    7 年前

    setState ,你应该监视,而不是嘲笑方法

    it('shall update targets when engine register has been called', () => 
     {
       const setStateSpy = jest.spyOn(LazyloadProvider.prototype, 'setState');
       const wrapper = shallow(
          <LazyloadProvider>
            <p>Wow</p>
          </LazyloadProvider>
        ).instance();
       expect(setStateSpy).toHaveBeenCalled();
    
       // write more tests that want the dom to update
     }