【问题标题】:JEST: unit tests are successful although an unknown component is usedJEST:尽管使用了未知组件,但单元测试成功
【发布时间】:2021-11-02 15:44:28
【问题描述】:

为什么即使使用了一个不存在但在 bitbucket 管道中的组件,单元测试也不会在本地失败?

为了演示这个问题,我创建了一个新的 nx 工作区 (Repository)。

在本地运行 'npx jest' 时,会出现一个 console.error,表明组件未知,但测试没有失败。另一方面,相同的命令在管道中导致相反的结果 (Pipeline)。这对我们来说是个大问题,因为单元测试只在流水线中失败,我们会浪费很多时间让它们重新启动和运行。

【问题讨论】:

  • 很难说,因为您的问题中没有包含单元测试。
  • 抱歉,这是标准生成的单元测试

标签: angular unit-testing jestjs monorepo nomachine-nx


【解决方案1】:

正如 AliF50 正确识别的那样,您的问题是由角度处理缺失元素类型导致的,具体取决于某些设置组件。 Monkey 修补 console.error 绝对是避免在本地出现此错误的可行解决方案。 但是您的构建在 bitbucket 管道中表现不同的原因是另外一回事。 如果您查看管道步骤npm ci 的日志输出,您可以看到最后一条日志消息是:

npm WARN 生命周期 pipeline-jest-test@0.0.0~postinstall: 无法运行 wd pipeline-jest-test@0.0.0 node ./decorate-angular-cli.js && ngcc --properties es2015 浏览器模块main (wd=/opt/atlassian/pipelines/agent/build)

这源于 npm 在以 root 身份运行时拒绝运行安装后脚本(如果您考虑一下,这在大多数情况下是有意义的)。它会尝试更改用户,这会导致您看到“无法在...中运行”的问题:

https://manpages.ubuntu.com/manpages/focal/en/man7/npm-scripts.7.html#user

如果 npm 是用 root 权限调用的,那么它会改变 uid 到用户帐户 或用户配置指定的uid,默认为nobody。设置 unsafe-perm 标志 以 root 权限运行脚本。

我认为会发生什么:

  • 您的安装后脚本未执行
  • 不调用 Ngcc 来预编译模块
  • 测试出于某种原因使用 JIT 编译(我不确定为什么)
  • “'not-existing-component' 不是已知元素”-警告变成错误。
  • 管道失败。

解决方案

详见https://stackoverflow.com/a/47748545/1658032

你有两个选择:

  1. 添加 --unsafe-perm
  2. 在 Dockerfile 中创建用户并切换到该用户

【讨论】:

    【解决方案2】:

    我认为您遇到了这个问题:https://github.com/angular/angular/issues/36430,而该用户的问题与您完全相同:https://github.com/angular/angular/issues/36430#issuecomment-611374846

    现在为什么它在 Bitbucket 管道上失败但在本地没有失败很奇怪。

    您可以尝试在test.ts 中添加类似的行到test.ts 的末尾:

    console.warn = function (message?: any, ...optionalParams: any[]): void {
      console.log({ message, optionalParams });
      fail('Test emitted a console warning!', message);
    };
    console.error = function (message?: any, ...optionalParams: any[]): void {
      console.log({ message, optionalParams });
      fail('Test emitted a console error!', message);
    };
    

    我们将覆盖 console.error 和 console.warn 的定义以使测试失败。

    那么单元测试应该会失败并出现is not a known element 错误。

    请注意,现在如果您的单元测试有 console.error 或 console.warn,单元测试将会失败。

    【讨论】:

      猜你喜欢
      • 2015-11-15
      • 2019-05-12
      • 1970-01-01
      • 1970-01-01
      • 2021-01-30
      • 2021-06-24
      • 2019-01-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多