0

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

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

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

4

2 回答 2

2

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

npm WARN 生命周期 pipeline-jest-test@0.0.0~postinstall: 无法在 wd pipeline-jest-test@0.0.0 节点中运行 ./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,默认为 none。设置 unsafe-perm 标志以使用 root 权限运行脚本。

我认为发生的事情是:

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

解决方案

https://stackoverflow.com/a/47748545/1658032中所述

你有两个选择:

  1. 添加 --unsafe-perm
  2. 在 Dockerfile 中创建一个用户并切换到它
于 2021-12-07T10:46:35.560 回答
1

我认为你正面临这个问题: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,单元测试将失败。

于 2021-11-03T13:07:21.793 回答