【问题标题】:Cannot import module from Cypress spec file无法从赛普拉斯规范文件导入模块
【发布时间】:2021-10-13 07:55:39
【问题描述】:

我正在尝试使用 @peculiar/x509 库来解码 CSR,以便在我的测试中使用一些信息。测试使用的是 Cypress。

这是我的代码摘录:

import * as x509 from '@peculiar/x509';
    
const request = {
  certificateSigningRequest: `-----BEGIN CERTIFICATE REQUEST-----
...
-----END CERTIFICATE REQUEST-----`,
};
    
describe('PKI', () => { 
  it('works', () => {
    console.log(x509);
    const stringPEM = request.certificateSigningRequest
      .replace(/(-----(BEGIN|END) CERTIFICATE REQUEST-----|\n)/g, "");
    const cert = new x509.X509Certificate(stringPEM);
    console.log(cert.subject);
    
    return;
    // Stuff I want to test
  });    
});

当我尝试记录 x509 变量时,它返回一个空对象。
const cert = new x509.X509Certificate(stringPEM); 行,我得到一个错误:

x509.X509Certificate is not a constructor.

如果我尝试使用 Typescript 文件设置一个简单的项目来导入库并只记录 x509 变量,它会正确显示所有导出。

我不明白为什么赛普拉斯会出现这种情况,因此感谢您提供任何帮助。

编辑:深入了解赛普拉斯的工作原理,我现在明白我对在 Node 进程中运行/控制的规范文件的假设是错误的。规范文件正在浏览器中运行。所以我需要在规范文件中注入库的浏览器版本。 这可以通过 Cypress 的插件 API 完成,因为它运行在 Cypress 节点进程中。

【问题讨论】:

  • 可能是 nodejs 版本问题。 @peculiar/x509 需要 14.x、15.x
  • 我的 NodeJS 版本是 14.x

标签: automation automated-tests cypress


【解决方案1】:

您可以导入特定的构建,x509.es.jsx509.cjs.js 并且您的代码可以正常工作。基础@peculiar/x509 用于包含<script>

有一件事,BEGIN 和 END 令牌需要保留在请求中才能被识别。

import * as x509 from '@peculiar/x509/build/x509.es.js'
// const x509 = require('@peculiar/x509/build/x509.cjs.js')  // alternative

// hard left for multiline strings, otherwise request is not correctly formatted
const request = {
  certificateSigningRequest: `-----BEGIN CERTIFICATE-----
...
-----END CERTIFICATE-----`,
};

// copied from @peculiar/x509 to verify format - not necessary for test
const isPem = (data) => {
  return typeof data === "string"
    && /-{5}BEGIN [A-Z0-9 ]+-{5}([a-zA-Z0-9=+/\n\r]+)-{5}END [A-Z0-9 ]+-{5}/g.test(data);
}
console.log(isPem(request.certificateSigningRequest))

describe('PKI', () => {

  it('works', () => {
    console.log(x509);
    const stringPEM = request.certificateSigningRequest // leave in BEGIN and END
    const cert = new x509.X509Certificate(stringPEM);
    console.log(cert.subject);    // prints e.g. "CN=Test certificate, E=some@email.net"

    return;
    // Stuff I want to test
  });

});

【讨论】:

    【解决方案2】:

    可能是由于 NodeJS 版本问题。

    X509Certificate 最近被添加到 NodeJS 版本 15.6.0 中。 Changelog here。所以它需要那个版本。由于 NodeJS 版本较新,它可能适用于您的简单项目。

    默认情况下,赛普拉斯使用其捆绑的 NodeJS 版本,从赛普拉斯版本7.0.08.2.0,它使用捆绑的 NodeJS 版本14.16.0,根据changelog here

    捆绑的 Node.js 版本从 12.18.3 升级到 14.16.0

    因此,您可以尝试根据 configuration 将 Cypress 配置中捆绑的 NodeJS 版本更改/覆盖为版本 15.6.0

    nodeVersion

    【讨论】:

    • X509Certificate 来自 @peculiar/x509 库。不是 NodeJS 的那个。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-12-23
    • 1970-01-01
    • 2021-11-04
    • 2021-05-31
    • 1970-01-01
    • 2020-10-26
    • 1970-01-01
    相关资源
    最近更新 更多