如何在Jest单元测试中模拟“ this”关键字

时间:2019-02-07 07:34:33

标签: javascript reactjs unit-testing this jestjs

我需要使用Jest单元测试来编写此代码:

componentDidUpdate(prevProps) {
    if (prevProps.socialMediaId !== this.props.socialMediaId) {
      if (typeof this.window.FB !== 'undefined') {
        this.window.FB.XFBML.parse();
      }
    }
  }

使用测试用例:

it('should test componentDidUpdate', () => {
    props.socialMediaId = '/old_id/';
    const component = mount(<MyComponent {...props} />);
    this.window.FB = {
      XFBML: {
        parse: () => {}
      }
    };
    props.socialMediaId = '/new_id/';
    component.setProps(props);
    expect(this.window.FB.XFBML.parse).toHaveBeenCalled();
  });

但是,我得到了错误:

  

TypeError:无法读取未定义的属性“窗口”

在这种情况下,如何使用“ ”关键字解决此问题?

1 个答案:

答案 0 :(得分:1)

此处this.myservice .api1(param1) .pipe( takeUntil(this.destroyed$), switchMap((result1) => { //do some operation and create object x(this.objx) return this.myservice.api2(param1); }), finalize(() => { //do something after both api calls are completed }, ).subscribe((result2) => { //do something based on result2 and this.objx }) 是组件属性,很可能用作全局this.window的抽象。 window中的this与测试中的componentDidUpdate是不同的对象

可以在组件实例上对其进行模拟:

this

根据经验,出于可测试性目的,所有无操作功能都应为Jest存根。