首页 > 解决方案 > 是否可以断言一个函数是否是一个空函数?

问题描述

我有一个像这样的通用输入组件:

class GenericInputComponent extends React.Component {
   constructor (props) {
    super(props);

    this.handleChange = this.handleChange.bind(this);
  }

  handleChange (evt) {
    this.props.onChange(evt);
  }

  render () {
    return (<Something />)
  }
}

GenericComponent.defaultProps = {
  onChange: () => {}
}

对于这个组件,我的一项测试是测试组件是否使用默认道具:

it('should use default props', function () {
   delete props.onChange // Before this the onChange was jest.fn()

   rendered.unmount()

   rendered = shallow(<Input {...props} />)

   let onChange = () => {}

   expect(rendered.instance().props.onChange).toEqual(onChange)
   expect(rendered.instance().props.onChange).toBeInstanceOf(Function)  
})

测试在以下行失败:

expect(rendered.instance().props.onChange).toEqual(onChange)

并给出此错误:

Expected value to equal:
      [Function onChange]
    Received:
      [Function onChange]

    Difference:

    Compared values have no visual difference.

据我所知,它应该会过去,但事实并非如此。为什么?是否可以断言正在使用的函数是否为空函数?

此外,如果我尝试像这样监视函数:

let onChangeSpy = jest.spyOn(rendered.instance().props, 'onChange')

我收到此错误:

`TypeError: Cannot assign to read only property 'onChange' of object '[object Object]'`

仅供参考,我正在使用shallow渲染进行测试。

那么可以断言一个空函数吗?此外,不幸的是,这是唯一coverage无法实现 100% 覆盖率的事情。

标签: reactjsjestjs

解决方案


这是意料之中的,因为函数是一个对象,并且对象在 JavaScript 中通过引用进行比较:

(() => {}) !== (() => {})

如果该方法为空,则可以通过断言来测试该方法onChange.toString()。但是这里要测试的onChange不仅仅是一些空函数,而是一个默认设置的道具。即它应该是:

expect(rendered.instance().props.onChange).toBe(GenericInputComponent.defaultProps.onChange)

如果该函数为空,则可以选择测试该函数:

expect(GenericInputComponent.defaultProps.onChange).toBeInstanceOf(Function);
expect(GenericInputComponent.defaultProps.onChange.toString().match(/\{(.*)}$/)[1])).toMatch(/^\s*$/);

推荐阅读