【问题标题】:Jest: Find out if current module is mocked during runtime笑话:找出当前模块是否在运行时被模拟
【发布时间】:2019-06-08 06:39:21
【问题描述】:

如果一个模块是通过 jest 模拟的,我有什么方法可以在运行时找出?

由于通常需要模拟模块,因此代码会被执行(如下所示:jest module executed even when mocked

我们需要这个,因为我们对每个文件进行了检查,以便在未设置强制环境变量时提前失败,这会导致即使模块被模拟,我们的测试也会失败。

if (!process.env.SOME_ENV) {
  throw new Error(`Mandatory environment variable 'SOME_ENV' not set`)
}

我们正在寻找这样的东西:

if (!process.env.SOME_ENV && utils.isNotMocked(this)) {
  throw new Error(`Mandatory environment variable 'SOME_ENV' not set`)
}

其中utils.isNotMocked(this) 是检查模块当前是否被模拟的魔术函数。

【问题讨论】:

  • 您最不想要的就是让您的被测代码知道它正在被测,您是否尝试过设置process.env.SOME_ENV 导入模块之前?
  • 当然可以,但是我们使用了很多这样的环境变量,而模拟的全部意义在于我们不想处理模拟模块的内部工作。将所有环境变量设置为虚拟值需要一些额外的不必要的努力。关于“你想要的最后一件事是让你的被测代码知道它正在被测试”我同意你的观点,但我也不希望一个模拟模块被执行。恕我直言,这是开玩笑的设计缺陷。

标签: node.js unit-testing mocking jestjs


【解决方案1】:

正如@jonrsharpe 提到的,通常不希望软件能够区分它是否在测试中。这意味着,您可能不会在任何模拟框架中找到您希望的功能。此外,提供这样一个特性可能存在更多基本问题,因为您可能有混合测试场景,其中某些测试用例使用模拟类的对象,而其他测试用例使用原始类的对象。

由于您在代码中使用早期退出机制作为一般模式,正如您所描述的那样:为这个检查创建一个库函数怎么样 - 然后在测试期间可以再次加倍,这样在这种情况下函数不会扔?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-12-11
    • 1970-01-01
    • 2018-12-31
    • 1970-01-01
    • 2018-07-27
    • 2019-04-10
    • 1970-01-01
    相关资源
    最近更新 更多