首页  >  文章  >  web前端  >  Jest 和 ESM 的测试问题以及解决方法

Jest 和 ESM 的测试问题以及解决方法

Linda Hamilton
Linda Hamilton原创
2024-11-09 22:05:02743浏览

Testing Troubles with Jest and ESM and how to fix it

本周,我的任务是向我的 RefactorCode 项目添加测试。当我开始添加新功能时,我注意到一些现有功能正在崩溃,并且手动测试所有内容变得越来越困难。这清楚地表明我需要实施适当的自动化测试以确保应用程序稳定。

由于我在之前的《程序员云计算》课程中使用过 Node.js,因此有过使用 Jest 的经验,所以我决定也将它用于这个项目。我首先编写一些测试来检查代码的功能。但是,我遇到了一些以前从未遇到过的错误。经过一些调试和 Stack Overflow 搜索后,我意识到在 Jest 中使用 ESM(ECMAScript 模块)时需要额外的配置。在我之前的项目中,我使用了 CommonJS,效果非常好。虽然我可以选择使用 Babel 进行转换,但 Jest 提供了一个新的测试版功能,允许 ESM 直接运行。我决定尝试一下,效果非常好!

这解释了与使用 ESM 配置 jest 相关的所有内容:https://jestjs.io/docs/ecmascript-modules

以下是设置的快速概述:

安装笑话:

npm install --save-dev jest

创建 jest.config.js 文件。在这里我还设置了要忽略的文件夹:

export default {
  testPathIgnorePatterns: ["/node_modules/", "/examples"],
  transform: {},
};

在 package.json 脚本部分,使用 jest 的实验参数来处理 ESM 模块:

"scripts": {
    "test": "node --experimental-vm-modules node_modules/jest/bin/jest.js"
}

创建一个测试文件。我在根目录的测试文件夹中创建了所有测试。这是我创建的一个简单的:

import { readFile, checkIfDirectory } from "../src/fileUtils";

describe("File Utility", () => {
    test("Read File", () => {
      readFile("./examples/test.txt").then((data) => {
        expect(data).toBe("Hello World");
      });

    });

    test('should return true if the path is a directory', async () => {
      const result = await checkIfDirectory('./examples');
      expect(result).toBe(true);
    });
});

如果您想使用单个测试文件进行测试:

npm test -- banner.test.js

为了运行所有测试,我们使用之前在 package.json 中添加的脚本:

npm run test

最后,基本测试完成了。然而,这只是我的故障排除之旅的开始。我在模拟库和模块方面也遇到了困难,特别是因为它们使用了 ESM。这些需要额外的配置,但经过一些调整后,我能够让一切正常工作,并且测试成功运行。

您必须使用jest.unstable_mockModule,而不是使用常规的jest.mock:

For example: await jest.unstable_mockModule("fs", () => ({
  existsSync: jest.fn(),
  readFileSync: jest.fn(),
}));

请参阅本节了解更多信息。

我想测试的核心功能之一涉及与​​ Gemini API 的集成。由于我不想依赖实时 API 进行测试,因此我决定模拟 API 调用。最初,我尝试使用 Nock,但遇到了问题,因为它与 Node 的默认 fetch 实现不能很好地配合。看来 Gemini 库使用的是默认的 fetch 而不是第三方的 fetch 实现,这导致了模拟失败。经过多次尝试没有成功后,我切换到另一个名为MSW(Mock Service Worker)的库。尽管创建模拟服务器需要更多的设置,但第一次尝试时它工作得非常完美。我根据 Gemini API 的响应方式制作了一个示例响应,这使我能够测试重构的功能。

以下是模拟服务器的设置方式以供参考:

npm install --save-dev jest

您可以看到我正在模拟我用于应用程序的特定 API 端点。现在您所要做的就是添加以下内容以在测试时启动服务器:

export default {
  testPathIgnorePatterns: ["/node_modules/", "/examples"],
  transform: {},
};

反思这个过程,这对我来说是一次很好的学习经历。事后看来,我可能应该检查我正在使用的库的兼容性,并事先考虑任何潜在的问题。尽管面临挑战,我很高兴我的测试能够顺利进行。我期待将来添加更多测试并提高项目的整体稳定性。

以上是Jest 和 ESM 的测试问题以及解决方法的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn