gpt4 book ai didi

javascript - 将表达式传递给 Jest.unmock

转载 作者:行者123 更新时间:2023-12-04 21:01:46 26 4
gpt4 key购买 nike

我正在实现一个实用函数,可以轻松调用 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 允许使用变量作为参数来提升 unm​​ock 调用,那么在定义变量之前使用变量将会出错:

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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com