javascript - JS : How to mock a nested function in a jestJS unit test?

标签 javascript unit-testing jestjs

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

通过我的尝试(见下文),我确实得到了错误 jest.fn() 值必须是模拟函数或 spy 。收到:未定义

函数

_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()
    })
})

最佳答案

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

expect(console.error()).toHaveBeenCalledWith('未收到 token ')

您想要传递函数本身,而不是结果:

expect(console.error).toHaveBeenCalledWith('未收到 token ')

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

global.console.error = jest.fn()

关于javascript - JS : How to mock a nested function in a jestJS unit test?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47247060/

相关文章:

javascript - 如何修复鼠标悬停删除按钮,以便我们可以通过键盘删除它?

javascript - 运行单元测试时出现语法错误后 PhantomJS 退出

javascript - 如何测试 axios 包装器

javascript - 导入 `spyOn` 函数摆脱 'not defined' eslint 错误

Javascript 新日期跨浏览器格式问题

javascript - d3.js : orthographic rotation optimization

ruby-on-rails - 带有载波的 Rails 3 测试 fixture ?

unit-testing - Jest React-native 如何模拟函数并返回响应

javascript - 如何在使用 vue.js 提交表单之前显示图像预览?

unit-testing - 对并发的Erlang代码进行单元测试的最佳方法是什么?