为什么要测试:单位和测试:功能强制坚持在开发环境中运行?

Jam*_*sen 11 ruby testing ruby-on-rails environment-variables

我正在尝试测试一些特定于环境的设置(中间件是特定的,但似乎并不重要),但我无法让测试在正确的环境中运行.症状:

  • 如果我运行ruby test/unit/my_test.rb,一切都很好,因为它做的第一件事是require test/test_helper.rb,它设置环境"test"然后加载Rails环境.
  • 如果我运行rake test,第一批(功能)运行正常,但第二批(单位)失败.失败的是,ENV['RAILS_ENV]不知何故在批次之间取消设置,然后config/environment.rb看到没有设置并使用默认值"development".config/environment.rb在该文件的配置块的开头和开头,环境是正确的,但最后是错误的.我可以通过使用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
Run Code Online (Sandbox Code Playgroud)

我甚至尝试:set_test_env每个测试任务创建一个单独的任务,以便我确信它会在每个测试任务之前被调用而不是仅仅调用一次.仍然没有骰子.它确实被调用,并且环境在开始时是正确的,config/environment.rb但内部出现问题.

我没有电话ENV['RAILS_ENV']在任何地方设置我的代码.

Ada*_*tek 5

为了给你一个完整的答案,我将不得不看看代码,但我会尝试给你一些可能有用的线索.

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

  1. 调用Rake进程并test当前环境中执行任务(默认情况下是开发),这就是为什么development.rb总是被读取.
  2. Rake任务在单独的子进程中调用测试加载器(您可以使用ps或验证它pstree),这test_helper.rb是源和环境设置为test的位置.

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


Kat*_*one 0

在 test_helper.rb 文件的顶部我有代码

ENV["RAILS_ENV"] = "test"
Run Code Online (Sandbox Code Playgroud)

如果没有该行,那么系统问题将在默认环境(即开发)中运行。