模拟和测试require.resolve玩笑 [英] Mocking and testing require.resolve calls in jest

查看:45
本文介绍了模拟和测试require.resolve玩笑的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

I want to mock a node's built-in function require.resolve in jest test suite. Here a working example of a problem on repl.it and the code itself:

测试对象(例如):

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仍然具有原始功能.

Inside of a test suite declaration everything is OK (see an output of a jest.isMockFunction(require.resolve)) and mock works. But for a test subject require.resolve remains with original functionality.

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

Due to this issue, this isn't pure unit test.

例如,如果我模拟了process.exit,一切都会按预期进行.

If I, for example, mock process.exit everything works as expected.

推荐答案

所以,这不是一个完美的解决方案,但是将(DI)require.resolve注入到其中更容易

So, not a perfect solution, but it is simpler to inject (DI) require.resolve into

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

module.exports = requirer

现在在测试套件中传递require.resolve的模拟版本可以正常工作

now in a test suite passing down mocked version of a require.resolve works as expected

const requirer = require('./requirer')

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

这篇关于模拟和测试require.resolve玩笑的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆