模拟和测试require.resolve以开玩笑的方式调用

问题描述 投票:1回答:1

我想在jest测试套件中模拟一个节点的内置函数require.resolve。这里有一个问题on repl.it和代码本身的工作示例:

测试对象(作为例子):

const requirer = () => {
  try {
    return require.resolve('./add')
  } catch (error) {
    console.error('failed to find a module')
  }
}

module.exports = requirer

测试套件:

const requirer = require('./requirer')

describe('attempt to mock require.resolve', () => {
   it('does not work', () => {
     require.resolve = jest.fn(arg => `./${arg}`)
     console.log(
       'is require.resolve mocked',
       jest.isMockFunction(require.resolve)) // will say true

     requirer()

     expect(require.resolve).toHaveBeenCalledTimes(1)
     expect(require.resolve).toBeCalledWith('')
  })
})

在测试套件声明中,一切正常(参见jest.isMockFunction(require.resolve)的输出)和模拟工作。但对于测试对象,require.resolve仍保留原始功能。

由于这个问题,这不是纯粹的单元测试。

如果我,例如,模拟process.exit一切正常工作。

unit-testing jestjs
1个回答
0
投票

因此,不是一个完美的解决方案,但注入(DI)require.resolve更简单

const requirer = (resolver) => {
  try {
    return resolver('./add')
  } catch (error) {
    console.error('failed to find a module')
  }
}

module.exports = requirer

现在在测试套件中传递模拟版本的require.resolve按预期工作

const requirer = require('./ requirer')

describe('attempt to mock require.resolve', () => {
   it('works', () => {
     require.resolve = jest.fn(arg => `./${arg}`)
     console.log(
       'is require.resolve mocked',
       jest.isMockFunction(require.resolve)) // will say true

     requirer(require.resolve)

     expect(require.resolve).toHaveBeenCalledTimes(1)
     // expect(require.resolve).toBeCalledWith('')
  })
})
© www.soinside.com 2019 - 2024. All rights reserved.