mocha / babel 如何动态转译我的测试代码?

2023-11-24

我的问题不是为什么有些东西不起作用,而是为什么它起作用。是的。

我有一个小NodeJS 命令行工具,其中包含 NodeJS 尚不支持开箱即用的功能,最值得注意的是:

  • import声明
  • String.includes().

因此,为了交付(构建),我转译+捆绑我的源代码(使用parcel,就像 webpack 一样)。

作为一个积极的奇迹,我的所有(除了一个)摩卡测试都运行了directly反对我的课程,而不是捆绑。尽管如此,它们仍然有效!其中包括很多import声明。并包括“ES6 自测试”:

it( 'String - include', () => {
    var s = 'Southern Bananas'
    assert( s.includes( 'anana' ) )
    assert( !s.includes( 'kiwi' ) )
} )

Thus:

我的 String.include 中有测试代码,不仅仅是在被测试的源代码中。而且没有地方可以转译或捆绑我的测试代码......因此对我的愚蠢问题表示歉意:

为什么这有效?某处是否有秘密的即时编译? (如果是的话,我也可以将其用于我的可交付测试代码的调试风格吗?)

my mocha.opts相当简单:

--require @babel/register
--require ./test/once.js  (nothing special here, either)
--reporter list
--recursive

my .babelrc有这个:

{
    "presets": [
        [
            "@babel/preset-env",
            {
                "targets": {
                    "Electron": "3.0",
                    "Node": "8.0"
                }
            }
        ]
    ],
    "plugins": [
        "@babel/plugin-transform-runtime"
    ],
    "retainLines": true,
    "comments": false,
    "sourceMaps": true
}

@babel/plugin-transform-runtime is apparently not to blame praise, as it explicitly states

注意:实例方法,例如“foobar”.includes(“foo”) 将不起作用,因为这需要修改 现有的内置插件(您可以使用 @babel/polyfill )。

Is @babel/polyfill包含在简约现代 afaik @babel/preset-env?我还做对了什么:+)?有没有办法将这个实时编译也用于我的(调试)构建?


长话短说

String.prototype.includesNode.js 从 v6.5 开始支持。@babel/register导致你的代码被动态编译,这就是为什么你的import声明有效。我怀疑你需要@babel/plugin-transform-runtime插件,除非我错过了你想要实现的目标。

什么会导致这种混乱?

我认为这个(完全可以理解的)谜团有两个根本原因:

  1. Babel 作者已经做到了really该工具易于使用;有时很难知道如何/何时调用它(特别是与 Mocha 等其他工具配合使用时)。
  2. Node.js 原生支持/不支持的内容(就 ES2015、ES2016 等而言)传统上很难跟上。

那么,接下来就是两个谜团了。

为什么String.prototype.includes work?

这个有更简单的解释。String.prototype.includes早在 Node.js v6.5 就得到了原生支持(如你看到的,自该版本起就支持绝大多数 ES2015)。

所以,虽然你是对的,但你没有@babel/polyfill配置(据我所知)并且你would在不支持的环境中需要它String.prototype.includes, 你的环境已经支持它!

来自 Node.js v8.x REPL:

> 'ES2015'.includes('2015')
true

为什么你的import声明工作?

正如您所说,Node.js v8.x本身不支持 ECMAScript 模块。然而,有一些不错的文章关于如何将其作为实验性功能启用从 Node.js v9.x 开始.

因此,您可以使用本机 Node.js v8.x(通过 REPL)获得以下内容:

> import path from 'path';
import path from 'path';
^^^^^^

SyntaxError: Unexpected token import

你的导入工作的原因是因为你的代码是由 Babel 使用@babel/preset-env preset.此外,该编译是由您触发的--require @babel/register摩卡选项。

@babel/register其工作原理是“将自身绑定到节点的要求并自动动态编译文件”。

这是一个基本示例@babel/register行动中:

从命令行:

$ node main.js
You will see this, because there is no syntax error!

main.js

require('@babel/register');
// This next file is compiled on the fly
require('./file1.js');

file1.js

import path from 'path';
console.log('You will see this, because there is no syntax error!');

好消息是,这就是 Mocha 建议您集成 Babel 的方式在他们的文档中. The --require选项基本上执行上面示例的操作:require('@babel/register');在 Mocha 使用之前调用require导入所有测试文件。

希望这可以帮助!同样,在 JavaScript 快速发展的现代时代,这是一个完全可以理解的谜团。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

mocha / babel 如何动态转译我的测试代码? 的相关文章

  • 通过嵌套数组对象属性将数组映射到字符串数组

    拥有包含嵌套数组的对象数组 let arr name aaa inputs inputName input 1 groups groupName group a name bbb inputs inputName input 2 group
  • NodeJs读取JSON文件

    我正在使用 NodeJs 读取 json 文件 我的代码非常基本 var obj require sample json console log obj 0 Sample json 文件包含这样的字符串化 JSON sample good
  • 变量前面加双下划线

    我的节点代码中有以下代码片段 var fs require fs fs readdir dirname function err files console log files 为什么变量 dirname 有双下划线 我知道一个下划线是私有
  • 语法:const {} = 变量名,任何人都可以解释或指出我正确的方向[重复]

    这个问题在这里已经有答案了 这个语法在 JavaScript 中意味着什么 可能是 ES6 const 变量名 我目前正在尝试掌握 React 在很多例子中我都遇到过这种语法 例如 const girls guys women men st
  • 无法使用 webpack 加载 Node 原生插件

    虽然我正在使用vue cli在生成 webpack 配置的示例代码中 没有任何特定于 vue 的内容 我像这样创建示例应用程序 vue init webpack webpack modules example 生成webpack base
  • 如何上传文件 - sails.js

    我可以下载图像和 pdf 但无法下载文档文件 doc pptx odt 下载文档 doc pptx odt 时 仅将其下载为 ZIP XML 文件 我可以做什么 我在用着 填写上传文件文档 https github com balderda
  • Morgan Logger + Express.js:写入文件并在控制台中显示

    我正在尝试将 Morgan 与 Express js 结合使用来编写日志文件 同时也在控制台上显示我的日志 我正在使用这段代码 var logger require morgan var accessLogStream fs createW
  • 计算两点之间的最短路线

    过去几周我一直在开发一款多人 HTML5 游戏 使用nodejs and websockets 我已经被这个问题困扰了一段时间 想象一下 我用数组实现了这个平铺地图 如下所示 1 or 棕色瓷砖 路上有障碍物 玩家无法通过 0 or 绿色瓷
  • Node.JS async.parallel 不会等到所有任务完成

    我在用异步并行 https github com caolan async并行运行两个函数 这些函数请求 RSS 源 然后 RSS 提要被解析并添加到我的网页中 但由于某种原因async parallel运行回调方法而不等待两个函数完成 文
  • 函数不会等到 Promise 得到解决

    我正在开发一个简单的不和谐机器人 我正在尝试打印有关某个玩家的一些一般数据 我最近了解了 async await 并尝试将其实现到我的代码中 然而 它似乎不起作用 因为当我第一次触发此代码时 它会打印 null 但在后续触发时 它将打印正确
  • 如何使用 AMQP 以“PeekLock”模式从 Azure 服务总线队列获取消息?

    我们正在尝试在 Node 应用程序中使用 Azure 服务总线 我们的要求是从队列中获取多条消息 由于Azure SDK for Node不支持批量检索 我们决定使用AMQP 虽然我们能够使用 Peek Messages 获取消息 如此处所
  • 循环中的 let 语句在 IE 中无法按预期工作

    我正在尝试 ECMAScript 6 中的一些示例 与其他浏览器相比 它的工作方式有所不同 这返回true在 Firefox 中 但它返回false在IE中 为什么这在 Internet Explorer 中的工作方式有所不同 let ca
  • 简单 AJAX Get 请求“待处理”

    我正在尝试实现一个简单的 AJAX GET 请求 该请求告诉服务器删除数据库中的文档 虽然我从服务器得到文档已删除的确认 但 Chrome 检查器显示该请求处于 待处理 状态 最终导致服务器错误 我做错了什么 HTML div class
  • 如何将对象数组传递给jade模板?

    我想将一组对象从 mongodb 传递到客户端 这是物体 var objeto img name name of the file image image jpg url title title of the image caption d
  • Node.js 上的 starttls > 0.4.0

    我遇到了这个线程Node js HTTPS 安全错误 https stackoverflow com questions 5136353 node js https secure error其中提到 tls 模块是现在在节点上执行 TLS
  • 如何导入和导出 javascript ES6 类

    我是 javascript 和 nodejs 的新手 我正在使用这个项目来发展我的技能并学习新技术 目前我的项目使用多个相互依赖的类 类文件位于不同的目录中 我当前正在尝试使用 export 和 require 语句来允许在其他文件中引用类
  • 当尝试将 formData 发送到 Express js 时,服务器无法识别 multipart/form-data

    我正在尝试将表单数据上传到快递服务器 在我的 Express js 服务器上 我有以下内容 router post uploads id function req res res send req body const title req
  • 嵌套异步/等待 Nodejs

    似乎无法弄清楚为什么这对我不起作用 我有一个父函数 它对子加载进程执行 AWAIT LOAD 进程又调用另一个名为 LOADDATA 的 AWAIT 所以基本上是这样的 module exports async function try a
  • Phantom-node模块无法加载外部资源

    我正在开发一个nodejs服务器 它将发布的html呈现为pdf png或jpg https github com svenhornberg pagetox https github com svenhornberg pagetox ser
  • 从节点服务器访问 Google Calendar API

    由于某种原因 我很难访问 Google 日历 我希望能够在 Node js 服务器的日历中添加和删除事件 我从文件中发现了非常矛盾的信息 我跟着 https developers google com identity protocols

随机推荐

  • .NET 列表视图刷新

    我有以下代码 它基本上从数据库中获取值并填充列表视图 using IDataReader reader cmd ExecuteReader lvwMyList Items Clear while reader Read ListViewIt
  • 为什么在 PHP 中使用“use”关键字来导入核心标识符?

    有时在一些图书馆 比如thephpleague csv 我看到use关键字来导入核心标识符 例如函数 类或常量 但我根本不明白为什么要导入它们 请参见以下示例 use Generator use SplFileObject use func
  • 谷歌云存储加入多个csv文件

    我将数据集从 Google BigQuery 导出到 Google Cloud Storage 考虑到文件大小 BigQuery 将文件导出为 99 个 csv 文件 然而 现在我想连接到我的 GCP 存储桶并使用 Spark 执行一些分析
  • 即使使用 nohup 子进程也会被杀死

    我在用着subprocess Popen启动多个进程 代码是这样的 while flag gt 0 flag check flag c MyClass num process 10 c launch MyClass如果类似以下内容 MyCl
  • Android MediaMetadataRetriever 从大多数键返回空值

    我想从我的媒体文件 主要是 mp3 中获取信息 但我从我想要的那些值中只得到 null 我已经尝试过所有按键extractMetadata key 我是否跳过 遗漏了某些内容 代码依据 MediaMetadataRetriever f ne
  • 为什么不能对函数的返回值使用数组索引? [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 为什么我不能这样做 explode 1 2 3 1 0 所有其他语言都支持它 我
  • rm、cp、mv 命令的参数列表太长错误

    我在 UNIX 的一个目录下有数百个 PDF PDF 的名称非常长 大约 60 个字符 当我尝试使用以下命令一起删除所有 PDF 时 rm f pdf 我收到以下错误 bin rm cannot execute Argument list
  • 如何从 flutter 中的数据快照获取特定值?

    我有这个数据快照 post1 pic https i redd it ni6zhxh874011 jpg title title desc desc post2 pic https i redd it krj9miojg5011 jpg t
  • Firebase 倒计时器在多个客户端之间同步

    我将尝试使用 Angular JS 为特定的利基市场构建一个便士拍卖网站 我正在尝试计划倒计时器 并且我一直渴望尝试一下 firebase 我昨天有一个想法 让每次拍卖在实际数据库中都有一个倒计时 因为通过 2 路数据绑定 人们的客户端将始
  • Xcode 4 和 Interface Builder:编辑垂直间距约束(锚定顶部,而不是底部)

    我有一个小部件在设备上未正确布局 其looks在 IB 中还可以 但不太正确 该小部件是一个标签 位于屏幕中间 Interface Builder 为其提供了带有 底部锚点 的垂直空间约束 在这里 底部意味着屏幕的底部 而不是下面的小部件
  • jQuery 自动完成(远程)- 示例

    我真的希望避免发布新问题 但我找不到 jQuery 自动完成远程功能的功能示例 其中包括调用页面和 搜索 页面 jQueryUI 演示和文档 部分不包含 search php 的源代码 我尝试了数十种组合 但这是我开始的组合
  • 什么是&=和|=

    我正在查看大型代码库中的一些 VC 代码 并发现了以下内容 if nState TOOL TIPS VISIBLE nState TOOL TIPS VISIBLE else nState TOOL TIPS VISIBLE break C
  • 是否有键盘快捷键可以浏览 Jupyter 笔记本中的历史记录

    有没有一种简单的方法可以浏览命令历史记录并在 Jupyter 笔记本中重用旧命令 有些相当于 iPython 控制台中使用的向上 向下箭头或 Mathematica 中使用的 符号 虽然对于专家来说答案可能看起来微不足道 但对于新手来说确实
  • PHP计算目录和子目录中的文件总数函数

    我需要获取指定目录中 JPG 文件的总数 包括其所有子目录 没有子子目录 结构如下 dir1 2 files subdir 1 8 files total dir1 10 个文件 dir2 5 files subdir 1 2 files
  • 多线程还是尽可能少的线程?

    作为一个业余项目 我目前正在为我曾经玩过的一款古老游戏编写服务器 我试图使服务器尽可能松散耦合 但我想知道对于多线程来说什么是好的设计决策 目前我有以下操作顺序 启动 创建 gt 服务器 监听客户端 创建 gt 客户端 监听命令并发送周期数
  • 如何使用用户的默认电子邮件客户端弹出撰写/创建邮件对话框?

    用例很简单 在某个时间点 我需要能够向用户展示他熟悉的撰写电子邮件对话框 Outlook 或其他 发件人 收件人 主题 等字段已填充了某些应用程序确定的值 该电子邮件还会附带一个附件 除非用户明确同意 否则不应发送邮件 我在 VB6 时代做
  • LINQ 中的升序/降序 - 可以通过参数更改顺序吗?

    我有一个给出参数 bool sortAscending 的方法 现在我想使用 LINQ 根据此参数创建排序列表 然后我得到了这个 var ascendingQuery from data in dataList orderby data P
  • c++ 从 hbitmap 获取原始像素数据

    我对使用 p invoke 调用相当陌生 想知道是否有人可以指导我如何从 hbitmap 检索原始像素数据 unsigned char 这是我的场景 我正在加载一个 NET 位图对象在C 侧并将其 IntPtr 发送到我的非托管 C 方法
  • 如何模拟用 jest.mock 模拟的类的实例方法?

    如何模拟正在模拟的类的实例方法jest mock 例如 一个类Logger被嘲笑 import Person from Person import Logger from Logger jest mock Logger describe P
  • mocha / babel 如何动态转译我的测试代码?

    我的问题不是为什么有些东西不起作用 而是为什么它起作用 是的 我有一个小NodeJS 命令行工具 其中包含 NodeJS 尚不支持开箱即用的功能 最值得注意的是 import声明 String includes 因此 为了交付 构建 我转译