11

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

  • 如果我运行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在该文件中配置块的开头和开头是正确的,但到最后是错误的。我可以通过使用 aputs或删除config/development.rb导致它找不到文件来判断。
  • 如果我运行rake test:units,我会遇到与第二批相同的问题rake test(即全部失败)
  • 如果我跑步rake test:functionals,我会得到与 for 相同的结果rake test:units
  • 如果我运行rake test RAILS_ENV=testor rake test:units RAILS_ENV=testor rake 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']在任何地方设置我的代码。

4

5 回答 5

5

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

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

  1. 在当前环境(默认为开发环境)中调用 Rake 进程并test执行任务,这就是为什么总是读取。development.rb
  2. Rake 任务在一个单独的子进程中ps调用测试加载器(您可以使用或来验证这一点pstree),这是test_helper.rb获取源并将环境设置为测试的地方。

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

于 2009-08-04T18:47:06.347 回答
2

我几乎总是想强制我的测试在“测试”环境中运行自己及其先决条件,尤其是当 ENV['RAILS_ENV'] 设置为任何常见默认值时(以避免灾难性事故),但我也想能够通过调用rake test:units RAILS_ENV=v_2_0_maint_test命令行在名为“v_2_0_maint_test”的环境或类似的环境上运行测试。

所以我有一个 test_tasks.rake 文件,它为我感兴趣的每个测试任务添加了一个先决条件。由于这个先决条件是预先设置的,因此任何其他先决条件(例如 db:test:prepare、db:fixtures:load)运行在相同的环境。这声称仅影响您想要影响的测试及其先决条件的优点

namespace :test do |n|
  [ n[:units], n[:functionals], n[:integration] ].each do |t|
    t.prerequisites.unshift(:set_test_env_dammit)
  end

  task :set_test_env_dammit do |t|
    if [ nil, "", "development", "staging", "production" ].index ENV['RAILS_ENV']
      RAILS_ENV = "test"
    end
  end
end
于 2010-06-17T15:39:30.977 回答
0

At the top of the test_helper.rb file I have the code

ENV["RAILS_ENV"] = "test"

If you do not have that line then the system problem would run in the default environment (i.e. development).

于 2009-06-13T21:52:19.667 回答
0

在整个项目中搜索 RAILS_ENV 及其变体。查看您是否在应用程序或测试中的某个位置设置了它。

另外,你在什么平台上运行?你能在另一台机器上运行测试,看看结果是否相同吗?

如果这是一个相对较新的开发,并且您使用的是 Git 或 SVN 等 RCS,您应该查看最近的提交,如果您专门使用 Git,您应该查看 git bisect。如果您不使用 RCS,则应该使用。

如果这确实是一个新的应用程序问题,那么它可能是您的环境问题。

您安装/配置了哪些插件和 gem?我们可以看到回溯吗?

于 2009-07-30T01:00:01.693 回答
-1

我实际上根本不相信你在这里有问题。我相信在某个时候你发现你的 rake 任务实际上是在开发环境中,你开始尝试找出为什么会这样。然后,您在开发配置文件中添加了一行以引发异常,这就是您的 rake 测试失败的原因。

如果您删除引发异常的行,那么您可能会发现测试都成功运行。

如果您尝试以下操作,您可能会发现它可以解释问题。

  1. 将环境设置为开发(仅用于跟踪目的)

    出口 RAILS_ENV=发展

  2. 删除环境文件中人为引发异常的所有行。
  3. 将以下行添加到 config/environments 中每个文件的末尾

    puts "**** In #{ENV['RAILS_ENV']} environment config ****"
    
  4. 将以下行添加到 test/test_helper.rb 中,就在设置要测试的环境的行下方。

    puts "**** Loading test helper **** Environment = #{ENV['RAILS_ENV']}"
    
  5. 使用 trace 选项运行 rake 以跟踪当前活动环境的执行情况。

    rake -t test
    
  6. 检查输出以确定您的环境设置不正确。
  7. 再次运行测试,但这次直接在运行测试之前设置环境,使用

    导出 RAILS_ENV=test

如果您确实有问题,那么也许您应该发布带​​有跟踪代码的 rake -t 的输出。

这是我在一个全新项目中的测试输出,并进行了一些最低限度的测试。您会注意到,在运行实际测试之前,环境始终是“测试”

** Invoke test (first_time)
** Execute test
** Invoke test:units (first_time)
** Invoke db:test:prepare (first_time)
** Invoke db:abort_if_pending_migrations (first_time)
** Invoke environment (first_time)
** Execute environment
**** In development environment config ****
** Execute db:abort_if_pending_migrations
** Execute db:test:prepare
** Invoke db:test:load (first_time)
** Invoke db:test:purge (first_time)
** Invoke environment
** Execute db:test:purge
** Execute db:test:load
** Invoke db:schema:load (first_time)
** Invoke environment
** Execute db:schema:load
** Execute test:units
**** Loading test helper **** Environment = test
**** In test environment config ****
Loaded suite /Library/Ruby/Gems/1.8/gems/rake-0.8.3/lib/rake/rake_test_loader
Started
.
Finished in 0.071771 seconds.

1 tests, 1 assertions, 0 failures, 0 errors
** Invoke test:functionals (first_time)
** Invoke db:test:prepare
** Execute test:functionals
**** Loading test helper **** Environment = test
**** In test environment config ****
Loaded suite /Library/Ruby/Gems/1.8/gems/rake-0.8.3/lib/rake/rake_test_loader
Started
.....
Finished in 0.133776 seconds.

5 tests, 6 assertions, 0 failures, 0 errors
** Invoke test:integration (first_time)
** Invoke db:test:prepare
** Execute test:integration
于 2009-07-31T05:58:52.880 回答