【发布时间】:2010-11-02 17:25:02
【问题描述】:
我正在尝试测试一些特定于环境的设置(具体来说是中间件,但这似乎并不重要),但我无法让测试在正确的环境中运行。症状:
- 如果我运行
ruby test/unit/my_test.rb,一切都很好,因为它首先需要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=test或rake test:units RAILS_ENV=test或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']。
【问题讨论】:
-
根据您关于 environment.rb 和删除 development.rb 的 cmets,查看您的 environment.rb 文件以及与 development.rb 文件丢失相关的堆栈跟踪或错误消息可能会有所帮助。跨度>
-
自己做很容易。 (1) 启动一个新的 Rails 应用程序。 (2) 在 config/environtments/development.rb 的末尾添加“raise 'development!'”行。 (3) 从命令行运行“rake tests”(或只是“rake”)。
-
啊。我想也许你有一个特殊情况,但问题可以在空白应用程序中重现。有趣的谜题。 :) 到目前为止,我能说的最好的是,Rails 系统在测试准备期间已加载,以检查待处理的数据库迁移,如果 ENV['RAILS_ENV'] 尚未设置,则将 RAILS_ENV 设置为 'development' .
-
不可能完全这么简单。如果是这样,那么我帖子末尾的示例代码 (task :set_test_env { ENV['RAILS_ENV'] = 'test' }; Rake::Task[:test].prerequisites.unshift :set_test_env) 将解决问题,它没有。但我们走在正确的轨道上。
-
问题是你在 development.rb 中有一些东西会破坏你的测试。找到更适合放置这些东西的地方,您的问题就解决了。将它移动到哪里取决于它到底在做什么,所以我的建议是发布你的 development.rb。
标签: ruby-on-rails ruby testing environment-variables