模拟显示为未定义

时间:2018-08-29 23:24:35

标签: javascript reactjs mocking jestjs

嗨,我试图对我的react应用程序中的一个功能进行两次测试,据我所知,我的模拟功能正在变成不确定的,我不知道为什么。我称这个模拟功能与该应用程序中的其他许多测试完全相同,但是这两个测试无法正常工作。

我无法通过测试

it('inTimeFrame() work', () => {
  const wrapper = shallow(<Reactpage />)
  wrapper.instance().fetchData = jest.fn()
  wrapper.instance().forceUpdate()
  wrapper.setState({'Date1':'2018-07-01','Date2':'2018-08-01'})
  wrapper.instance().inTimeFrame()
  expect(wrapper.instance().fetchData()).toHaveBeenCalledTimes(1)
})

it('inTimeFrame() throw error3', () => {
  const wrapper = shallow(<Reactpage />)
  wrapper.instance().fetchData = jest.fn()
  wrapper.instance().forceUpdate()
  wrapper.setState({'Date1':'2016-07-01','Date2':'2018-08-01',
                    'getJson':[{'1':1},{'2':2}], 'fetching':true})
  wrapper.instance().inTimeFrame()
  expect(wrapper.instance().fetchData()).not.toHaveBeenCalled()
  expect(wrapper.state('error3')).toEqual(true)
  expect(wrapper.state('getJson')).toEqual({})
})

我要测试的功能

inTimeFrame = () => {
    var d1 = moment(this.state.Date1, 'YYYY-MM-DD')
    var d2 = moment(this.state.Date2, 'YYYY-MM-DD')
    var maxBack = moment().subtract(1, 'year')
    if (  d1.diff(d2, 'years') <= 1 && d1.isSameOrAfter(maxBack, 'day')){
        this.fetchData()
    }else{
        this.setState({"error3":true, "getJson":{}})
    }
}

npm测试的输出

enter image description here

有人知道如何解决此问题,以使我的模拟不会变成未定义的吗?

1 个答案:

答案 0 :(得分:2)

expect(...).toHaveBeenCalled接受一个模拟函数。您正在通过undefined

  1. 您使用wrapper.instance().fetchData = jest.fn()
  2. 创建了一个模拟函数
  3. 除非您告知,否则jest.fn()会创建一个现在返回undefined的函数。
  4. 您正在调用fetchData,并将结果undefined)传递给Expect函数。

您需要更改:

expect(wrapper.instance().fetchData()).toHaveBeenCalledTimes(1)

收件人:

expect(wrapper.instance().fetchData).toHaveBeenCalledTimes(1)

并对您的其他测试进行类似的更改