我正在实现一个实用函数,可以轻松调用 jest.unmock
多次
原来jest.unmock
only expects string literal
jest.unmock('got') // works
const mod = 'got'
jest.unmock(mod) // does not work
我尝试使用
eval
像下面但它不起作用const mod = "'got'"
eval(`jest.unmock(${mod})`)
有什么工作可以做到这一点吗?
这背后的原因是什么?
最佳答案
Jest unmock 调用应该在任何 import 语句之前发生,所以
jest.unmock("got");
let got = require("got");
工作,而
let got = require("got");
jest.unmock("got");
才不是。
为了让这个更容易使用,Jest 提供了一个 babel 插件 babel-plugin-jest-hoist将 unmock 调用提升到所有 import 语句之上。它使这段代码:
let got = require("got");
jest.unmock("got");
在编译时转换为
jest.unmock("got");
let got = require("got");
因此,即使看起来您在 import 之后调用 unmock,实际上您是在 import 语句之前调用它。 Playground
如果 jest-hoist 允许使用变量作为参数来提升 unmock 调用,那么在定义变量之前使用变量将会出错:
let got = require("got");
const mod = 'got'
jest.unmock(mod)
会变成
jest.unmock(mod)
let got = require("got");
const mod = 'got'
为了防止这种情况,jest-hoist 在参数中使用变量时禁用提升。但是,如果在 require 之前没有调用 jest.unmock,则 require 会正常执行,而模块仍处于模拟状态。
为了解决这个问题,你可以确保你的 unmock 调用在你需要 unmock 的任何 require 语句之前。如果您的代码是:
const mod = 'got'
jest.unmock(mod)
let got = require("got");
jest-hoist 什么都不做,您的代码将按预期工作。
关于javascript - 将表达式传递给 Jest.unmock,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58627484/