【问题标题】:Jest mocked spy function, not being called in testJest 模拟了间谍功能,在测试中没有被调用
【发布时间】:2019-11-18 11:00:35
【问题描述】:

组件:

带有 onChange 处理程序的 Input 组件:

<Field
    component={FormattedTextInput}
    className={colMd113}
    name={NAMES.VEHICLE_YEAR}
    label={constants.VEHICLE_YEAR}
    validate={[required, validator.validateYearOfVehicle]}
    formatting="9999"
    onChange={this.yearOnChange}
/>

方法:

constructor(props) {
    super(props);

    this.yearOnChange = this.yearOnChange.bind(this)
}

yearOnChange(event) {
    if (event.target && event.target.value) {
        const value = event.target.value;
        this.setState({
            year: value
        });
    }
}

测试

it('yearOnChange method is called', function() {
    const spy = jest.spyOn(wrapper.instance(), 'yearOnChange');
    wrapper.update();
    // const instance = wrapper.instance();
    // console.log('instance', instance);
    wrapper.simulate('change', {
        target: {
            name: 'vehicleYear',
            value: '1999'
        }
    });
    expect(spy).toHaveBeenCalled();
});

错误

Vehicle Picker Component › yearOnChange method is called

   expect(jest.fn()).toBeCalled()

   Expected mock function to have been called, but it was not called.

     50 |         console.log(wrapper.instance())
     51 |
   > 52 |         expect(spy).toBeCalled();
        |                     ^
     53 |     });

这是我们在登录 wrapper.instance() 时看到的内容

VehiclePicker {
       props: {},
       context: {},
       refs: {},
       updater:
        Updater {
          _renderer:
           ReactShallowRenderer {
             _context: {},
             _element: [Object],
             _instance: [Circular],
             _newState: null,
             _rendered: [Object],
             _rendering: false,
             _forcedUpdate: false,
             _updater: [Circular],
             _dispatcher: [Object],
             _workInProgressHook: null,
             _firstWorkInProgressHook: null,
             _isReRender: false,
             _didScheduleRenderPhaseUpdate: false,
             _renderPhaseUpdates: null,
             _numberOfReRenders: 0 },
          _callbacks: [] },
       state:
        { year: '',
          make: '',
          makeArray: [],
          model: '',
          modelArray: [],
          token: '' },
       yearOnChange: [Function: bound yearOnChange],
       makeOnChange: [Function: bound makeOnChange],
       setState: [Function] }

更新

使用以下代码,expect(result).toEqual('1999') 测试有效!但是expect(spy).toHaveBeenCalled() 仍然没有:( 当我实例化方法yearOnChange 并实际更改组件中的状态时,仍然没有检测到间谍被调用,这是怎么回事?

it('yearOnChange method is called', function() {
   const spy = jest.spyOn(VehiclePicker.prototype, 'yearOnChange');
   wrapper.instance().forceUpdate();

   const event = {
       target: {
           value: '1999'
       }
   };

   wrapper.instance().yearOnChange(event);
   wrapper.simulate('change', event);

   const result = wrapper.state('year');
   console.log('result', result); // result = 1999
   expect(result).toEqual('1999');
   expect(spy).toHaveBeenCalled();
});

【问题讨论】:

  • 您能否发布一个 sn-p 说明您如何将 yearOnChange 方法绑定到实例?
  • 您执行的是浅装还是全装?
  • @shamsup 添加了!詹姆斯,使用浅,我遇到了 mount 和 redux-forms 的问题:(
  • 这能回答你的问题吗? Jest spyOn function called

标签: javascript reactjs jestjs spy


【解决方案1】:

您正在监视并手动调用 yearOnChange。

尽量不要调用 wrapper.instance().yearOnChange(event);

调用wrapper.instance().onChange 事件,或者像你一样,运行模拟('change') 就足够了。

你也可以试试VehiclePicker.prototype.yearOnChange = jest.fn()

expect(VehiclePicker.prototype.yearOnChange).toBeCalled();

【讨论】:

    【解决方案2】:

    从这里的答案中找到了很大的帮助:Jest spyOn function called

    这是我错过的重要一步:

    const instance = wrapper.instance()
    const spy = jest.spyOn(instance, 'yearOnChange')
    

    使用 2 个工作 expects 更新工作测试。

    it('yearOnChange method is called', function() {
        const instance = wrapper.instance();  // <-- Needed to do this here
        const spy = jest.spyOn(instance, 'yearOnChange');  // <-- Then use instance here
        wrapper.instance().forceUpdate();
        
        const event = {
            target: {
                value: '1999'
            }
        };
    
        wrapper.instance().yearOnChange(event);
        wrapper.simulate('change', event);
    
        const result = wrapper.state('year');
        console.log('result', result); // result = 1999
        expect(result).toEqual('1999');
        expect(spy).toHaveBeenCalled();
    });
    

    【讨论】:

    • 只是在你的测试代码上的一个注释,通常当你在监视某些东西时,你不应该像这里那样自己调用它wrapper.instance().yearOnChange(event);
    猜你喜欢
    • 2022-01-15
    • 1970-01-01
    • 2021-10-13
    • 2019-10-08
    • 1970-01-01
    • 1970-01-01
    • 2020-10-26
    • 1970-01-01
    • 2021-09-15
    相关资源
    最近更新 更多