- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
{ expect(btoa("aaa")).toStrictEqual("YWFh"); }); 失败 ReferenceE-6ren">
创建一个 Jest 测试,例如:
test("btoa", () => {
expect(btoa("aaa")).toStrictEqual("YWFh");
});
失败
ReferenceError: btoa is not defined
但是,从节点 16 开始,node
确实定义了 btoa
,因此如下:
console.log(bota("aaa"))
正确输出YWFh
。
我如何配置 jest 才能让这个测试通过?显然,jest 测试运行器中发生了某些事情,无法在当前节点环境中执行,或者正在剥离特定的内置函数,只是我似乎找不到任何关于如何调试或调整它的文档。
通过在“纯 js”中手动编写编码或依赖于类似的东西,有一些解决方法,但我特别感兴趣的是为什么 Jest 执行结束无法找到似乎存在于其他环境。
这在 mocha 等其他测试框架中也能正常工作,因此它显然与 jest runner 尤其相关。
最佳答案
在对 为什么 btoa/atob
在 node 中可用但在 jest running in node 中不可用进行了大量搜索和摸索之后,我终于弄明白了。 Jest 在 vm
中运行所有测试,这是一个隔离的沙箱环境。 btoa/atob
方法不会自动暴露在 VM 内的 global
对象上。最好用例子来解释:
const vm = require('vm');
// this works outside the vm - but for legacy reasons only
// you shouldn't be doing this in the first place
btoa('aaa'); // -> "YWFh"
const context = vm.createContext({});
const code = 'btoa("aaa")';
vm.runInContext(code, context); //-> Uncaught ReferenceError: btoa is not defined
Note: The answer described below is still the "solution" - you need to define these methods for use in node, and then you need to expose them using jest's
globalSetup
.
问题的根源在于 NodeJS 和网络浏览器具有不同的 API。例如,当我尝试在我的节点应用程序中使用 btoa
时收到此弃用通知。
解决方案的第一部分是您需要提供自己的 atob
/btoa
方法以在 NodeJs 中使用(参见 examples here )。然后您需要使用 jest 的 globalSetup
使这些可用配置:
/** Encodes a string as base64 format */
global.btoa = (str: string) => Buffer.from(str, 'binary').toString('base64');
/** Decodes a base64 encoded string */
global.atob = (str: string) => Buffer.from(str, 'base64').toString('binary');
如果您觉得自己做这件事不自在,可以使用一些库和工具为您做这件事(jsdom、phantomjs、testing-library)。这些库本质上是在节点环境中复制浏览器 API,以执行运行测试、服务器端渲染等操作。我建议阅读 testing web frameworks。代码示例和技术。
关于javascript - 开 Jest 找不到 `bota` 和 `atob`,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70960157/
我正在尝试在 Windows 上运行的小于 1GB 的 VM 上设置 YouTrack 和 TeamCity。使用率将非常低(用户和请求)。这是一个 POC 环境,如果它有效,我可能会将它推送到一个超
所以我在尝试使用 FORFILES 解决这个问题时遇到了麻烦。我正在尝试获取不超过 4 天的文件。所以基本上少于 4 天。然而,这似乎不太可能,因为/d -4 获取所有 4 天或更早的项目。 以下是我
如何从下面的 events 表中选择小于 15 分钟前创建的 events? CREATE TABLE events ( created_at timestamp NOT NULL DEFAU
Google Analytics Realtime提供 rt:minutesAgo ,可以过滤查询。 然而,它是一个维度而不是一个度量标准,<=不能在过滤器中使用。 假设我想在最后 n 分钟内获得一些
iOS 核心数据 - 严重的应用程序错误 - 尝试插入 nil 你好, 我的应用程序实际上运行稳定,但在极少数情况下它会崩溃并显示此错误消息... 2019-04-02 20:48:52.437172
我想制作一个 html div 以快速向右移动(例如不到 1 秒)并消失。然后1秒后再次直接出现在这个过程最开始div的位置。此过程将由单击按钮并重复 10 次触发。 我试图在 CSS 中使用过渡属性
我发现使用 TimeTrigger 是 Windows 10 (UWP) 上计划后台任务的方式。但是看起来我们需要给出的最小数字是 15 分钟。只是想知道,即使我们安排它在接下来的 1 分钟内运行,警
我必须在 1 秒内在屏幕上打印 2^20 行整数 printf 不够快,还有其他易于使用的快速输出替代方法吗? 每一行只包含 1 个整数。 我要求它用于竞争性编程问题,我必须将其源代码提交给法官。 最
我是一名优秀的程序员,十分优秀!