提问人:aks 提问时间:9/29/2023 更新时间:9/29/2023 访问量:48
Rails 测试正在通过,但由于语法错误,服务器拒绝开始生产 [已关闭]
Rails tests are passing but server refuses to start on production due to syntax error [closed]
问:
这是我面临的一个奇怪的问题。所有测试用例都在 CI/CD 上传递,但其中一个文件中存在语法错误。
当此更改进入生产环境时,服务器拒绝启动。
这是正确的预期行为吗?
我可以选择对与语法相关的错误进行某种健全性检查,以便 CI/CD 失败并且不让人们继续部署?
答:
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_reloading
config.cache_classes
0赞
Greg
9/29/2023
谢谢!我已经更新了答案。
0赞
aks
10/3/2023
在测试环境中快速加载为我解决了这个问题。
评论