草庐IT

ruby-on-rails - 为什么要测试:units and test:functionals insist on running in development environment?

coder 2025-05-25 原文

我正在尝试测试一些特定于环境的设置(特定于中间件,但这似乎无关紧要),但我无法让测试在正确的环境中运行。症状:

  • 如果我运行 ruby test/unit/my_test.rb,一切都很好,因为它做的第一件事是需要 test/test_helper.rb,这会设置环境"test" 然后加载 Rails 环境。
  • 如果我运行 rake test,第一批(功能)运行良好,但第二批(单元)失败。失败是 ENV['RAILS_ENV] 以某种方式在批处理之间未设置,然后 config/environment.rb 看到没有设置并使用默认值 "development “。环境在 config/environment.rb 的开头和该文件中配置 block 的开头是正确的,但到最后是错误的。我可以通过使用 puts 或删除 config/development.rb 导致它找不到文件来判断。
  • 如果我运行 rake test:units,我会遇到与第二批 rake test 相同的问题(即全部失败)
  • 如果我运行 rake test:functionals,我会得到与 rake test:units 相同的结果
  • 如果我运行 rake test RAILS_ENV=testrake test:units RAILS_ENV=testrake test:functionals RAILS_ENV=test,所有很好!

我试过的一件事根本不起作用:

# in Rakefile:
task :set_test_env { ENV['RAILS_ENV'] = 'test' }
Rake::Task[:test].prerequisites.unshift :set_test_env
# and similarly for other test tasks

我什至尝试为 每个测试任务 创建一个单独的 :set_test_env 任务,这样我就可以确定它会在每个测试任务之前被调用,而不是只调用一次。仍然没有骰子。它确实被调用,并且在 config/environment.rb 开头的环境是正确的,但内部出现问题。

我没有调用在我的代码中的任何地方设置 ENV['RAILS_ENV']

最佳答案

为了给你一个完整的答案,我必须看一下代码,但我会尽量给你一些可能有用的线索。

首先,rake test 和所有其他变体(test:unitstest:functionals 等)的工作方式如下

  1. 调用 Rake 进程并在当前环境(默认为开发环境)中执行任务 test,这就是 development.rb 的原因始终阅读。
  2. Rake 任务调用测试加载器在一个单独的子进程中(您可以使用pspstree 验证),这是获取了 test_helper.rb 并将环境设置为测试。

当您运行 ruby test/unit/my_test.rb 时,第一步被跳过,所以看起来问题出在那里。也许您在 development.rb 中做了一些对子进程有副作用的事情?

关于ruby-on-rails - 为什么要测试:units and test:functionals insist on running in development environment?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/991038/

有关ruby-on-rails - 为什么要测试:units and test:functionals insist on running in development environment?的更多相关文章

随机推荐