JS:如何在jestJS单元测试中模拟嵌套函数?

时间:2017-11-12 08:55:47

标签: javascript unit-testing jestjs

如何在jest单元测试中模拟嵌套的console.error

我的尝试(见下文)我收到错误jest.fn() value must be a mock function or spy. Received: undefined

功能

_onSubmit = (event) => {
  event.preventDefault()
  const { username, password } = this.state

  return this.props.createUserMutation({
    variables: { username, password }
  }).then(response => {
    const token = response.data.createUser.token
    if (token) {
      // do something
    } else {
      console.error('No token recieved')
    }
  })
}

测试

it('_onSubmit() should log error, if no token is recieved', (done) => {
  console['error'] = jest.fn()

  const createUserMutation = () => {
    return Promise.resolve({
      data: {
        createUser: { token: undefined }
      }
    })
  }
  const wrapper = shallow(<CreateAccount
    createUserMutation={createUserMutation}
  />)

  wrapper
    .update()
    .find(Form)
    .props()
    .onSubmit({ preventDefault: () => {} })
    .then(() => {
      expect(console.error()).toHaveBeenCalledWith('No token recieved')
      done()
    })
})

1 个答案:

答案 0 :(得分:1)

在这一行中,您调用函数console.error而不是将函数传递给期望,这就是为什么您未定义,因为此fn不会返回任何内容:< / p>

expect(console.error()).toHaveBeenCalledWith('No token recieved')

而不是结果,你想要像这样传递函数:

expect(console.error).toHaveBeenCalledWith('No token recieved')

此外,由于您正在尝试模拟全局控制台功能,因此您可能需要将模拟设置更改为以下内容:

global.console.error = jest.fn()