Rails 测试正在通过,但由于语法错误,服务器拒绝开始生产 [已关闭]

Rails tests are passing but server refuses to start on production due to syntax error [closed]

提问人:aks 提问时间:9/29/2023 更新时间:9/29/2023 访问量:48

问:


想改进这个问题吗?通过编辑这篇文章添加详细信息并澄清问题。

上个月关闭。

这是我面临的一个奇怪的问题。所有测试用例都在 CI/CD 上传递,但其中一个文件中存在语法错误。

当此更改进入生产环境时,服务器拒绝启动。

这是正确的预期行为吗?

我可以选择对与语法相关的错误进行某种健全性检查,以便 CI/CD 失败并且不让人们继续部署?

Ruby-on-Rails rSpec TDD 小测试

评论

0赞 max 9/29/2023
在 Ruby 版本方面,你有开发/生产奇偶校验吗?在我以前作为PHP开发人员的生活中,当我向客户交付代码时,我被烧了好几次,他们继续将其部署到一些运行古老版本PHP的糟糕网络酒店。
0赞 engineersmnky 9/29/2023
SyntaxError 绝对会附带堆栈跟踪。查看此内容将帮助您确定错误所在。如果您无法确定原因,请在此处发布堆栈跟踪和违规代码以及适用的详细信息,包括 ruby 版本。

答:

1赞 Greg 9/29/2023 #1

在运行测试时,您很可能没有加载有问题的类(这意味着 - 您很可能没有测试需要加载该类的代码)。

不同的行为很可能是由于生产环境和测试环境之间的配置不同,即:

config.cache_classes = true
# or, depending on your rails version (see: https://guides.rubyonrails.org/autoloading_and_reloading_constants.html#eager-loading) 
config.eager_load = true

生产环境通常在启动服务器之前预加载所有类,在开发和测试环境中,“延迟加载”是游戏的名称(意味着类在需要时加载)。

由于您的 CI/CD 无论如何都在运行所有规范,因此请考虑在您的配置中:config/enviroments/test.rb

config.cache_classes = ENV.fetch("CI", false)
# or
config.eager_load = ENV.fetch("CI", false)

(大多数 CI 服务都在设置 env 变量,如果你没有它 - 你需要实现一种方法来“告诉”你的代码它在 CI 上运行。CI=true

评论

0赞 max 9/29/2023
实际上,Rails 中测试环境的默认值是 Spring,尽管 Spring 可以修改它。这在 Rails 7 中是正确的,而且几乎可以追溯到我记得的时候。代码重新加载在测试环境中实际上没有多大意义,除非你使用像 Spring 这样的预加载器。这不是一个交互式会话,您需要像在控制台中四处走动时那样热插拔代码。config.cache_classes = true
1赞 max 9/29/2023
现代设置也只是为遗留支持而提供的。guides.rubyonrails.org/......config.enable_reloadingconfig.cache_classes
0赞 Greg 9/29/2023
谢谢!我已经更新了答案。
0赞 aks 10/3/2023
在测试环境中快速加载为我解决了这个问题。