开玩笑模拟 returns 一个对象的函数

jest mock function that returns an object

我有一个函数return是一个对象

function getSettings() {
  return {
    foo: 'bar'
  }
}

我有一个函数在内部使用上面的函数

function myFunction() {
  const { foo } = getSettings()

  return foo
}

我有一个测试想改变foo

的值
it('', async () => {
  const value = '123'

  const fooObj = {value: '123'}
  jest.spyOn(getSettings, 'foo').mockReturnValue(fooObj )

  const result = myFunction()

  expect(result).toBe(value)
})

但这不起作用。知道如何模拟 getSettings 的 return 值吗?

问题编辑(附上错误图片)和代码更新后

你做不到 jest.spyOn(getSettings, 'foo') 你需要把 object/module 放在第一个参数中,第二个参数应该是函数名。

您可以通过将其更改为来测试它:

const fileWithGetSetting = require('<your-path>');

it('', async () => {
  // the key should be foo and not value
  const fooObj = {foo: '123'}

  jest.spyOn(fileWithGetSetting, 'getSettings').mockReturnValue(fooObj)

  const result = myFunction()

  expect(result).toBe(fooObj.foo)
})


如果 foo 是原始的(就像在你的测试中),你需要更新对象 属性 如果值

function myFunction() {
  const settings = getSettings()
  // operation on setting.foo (if foo is primitive)
  return setting.foo
}

并在测试中传递对象而不是原始值

it('', async () => {
  const obj = {foo: '123'}

  jest.spyOn(getSettings, 'foo').mockReturnValue(obj)

  const result = myFunction()

  expect(result).toBe(obj.foo)
})

当您在测试中通过 foo 时,您通过了值传递,您需要通过引用传递它