当前位置: 首页 > 知识库问答 >
问题:

Jest没有找到“bota”和“atoba”

易成天
2023-03-14

创建一个jest测试,如:

test("btoa", () => {
  expect(btoa("aaa")).toStrictEqual("YWFh");
});

失败,原因是

ReferenceError: btoa is not defined

但是,节点确实将 BTOA 定义为节点 16,因此如下所示:

console.log(bota("aaa"))

正确输出YWFh

如何配置开玩笑以使此测试通过?显然,在开玩笑的测试运行器中发生了一些事情,无法在当前节点环境中执行,或者正在剥离特定的内置功能,只是我似乎找不到任何有关如何调试或调整的文档。

通过在“纯js”中手动编写编码或依赖于类似的东西,可以解决一些问题,但我特别感兴趣的是为什么jest执行结尾无法找到似乎存在于其他环境中的内置程序。

这在mocha等其他测试框架中也能很好地工作,因此它显然与jest runner特别相关。

共有1个答案

皇甫逸清
2023-03-14

在进行了大量的搜索和绞尽脑汁之后,我终于弄明白了为什么< code>btoa/atob在node中可用,而在jest中运行时却不可用。Jest在一个< code>vm中运行所有测试,这是一个隔离的沙盒环境。< code>btoa/atob方法不会在VM内部的< code>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

注意:下面描述的答案仍然是“解决方案”——您需要定义这些方法以便在node中使用,然后您需要使用jest的< code>globalSetup来公开它们。

你的问题的根源是NodeJS和web浏览器有不同的API。例如,当我试图在我的节点应用程序中使用< code>btoa时,我收到了这个反对通知。

该解决方案的第一部分是您需要提供自己的 atob/btoa 方法以在 NodeJs 中使用(请参阅此处的示例)。然后你需要使用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');

如果你觉得自己做这件事不舒服,有一些库和工具可以为你做这件事(js写下、phantomjs、testing-库)。这些库本质上是在节点环境中复制浏览器API,用于运行测试、服务端渲染等工作。我建议阅读有关测试Web框架的代码示例和技术。

 类似资料:
  • 我正在使用kustomize在一个新的k8s集群(v1.17.2)上将清单传输到kubectl。这包括CRD,但其他对象无法找到它们。例如: CRD是在我的kubectl的部分中定义的,它们显示在我向kubectl传送的输出中,我确信上次将所有内容放在一个文件中的方法是有效的。 如果我先应用CRD,然后分别应用主清单,这一切都会顺利进行。我能同时做这些吗?如果是,我做错了什么;如果没有,为什么它以

  • 我试图从mysql数据库中获取数据,我使用从CrudRepository扩展而来的标签@repository接口,但当我尝试调用任何方法时,它会说nullPointerExctive,如Count()或findAll()。 此外,我还有一条警告:未找到引用bean“entityManagerFactory” 我已经试着删除了。m2文件夹,在我调用存储库接口的类上添加@Service标记。 我已经提

  • 我正在使用安装在本地主机上的wordpress构建一个站点。 出于某种原因,我的post.php页面没有显示帖子缩略图(特色图片)。我已经确定,这是一个问题,timthumb.php这是不正确的定位图像网址。我在网上搜索了几个小时,尝试了许多解决方案,但似乎没有任何效果。 基本问题是我在blog.php文件中的这一行: My functions.php脚本将get_image_url定义如下: 在

  • 问题内容: 我正在使用gradlew进行Java项目。我使用Ubuntu Linux作为操作系统。当我运行“ gradle”时,它将运行并提供信息。但是,当我运行“ gradlew”时,其输出为“未找到命令’gradlew’,您的意思是:软件包’gradle’(universe)gradlew中的命令’gradle’:未找到命令” 我做了研究,有了jdk,并且做了sudo apt-get inst

  • 我在使用coroutine时遇到了这个问题,你能告诉我为什么我会得到这个错误吗 实现'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.0.1‘实现'org.jetbrains.kotlinx:kotlinx-coroutines-Android:1.0.1' kotlin版本是:ext.kotlin_version='1.3.10'