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

标签 javascript jestjs babeljs

我正在实现一个实用函数,可以轻松调用 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/

相关文章:

babeljs - 在 babel 6 中使用 es2015 预设时,有没有办法使用松散的模块?

node.js - 未调用模拟 Jest 回调方法

jestjs - 如何使用 jest 和 babel v7 避免 "TypeError: Cannot set property"错误?

javascript - 在 typescript 中获取类的属性

javascript - 如何强制元素在中间?

javascript - Jest 中的定时函数调用

javascript - Babel 6 转换运行时 : $export is not a function

javascript - 在 MongoDB 中使用原生 ES6 Promise

javascript - 表索引和成员绑定(bind)

带过滤器的 JavaScript if 语句将不起作用