首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Rails 4,New :为什么测试在开发环境中运行?

Rails 4,New :为什么测试在开发环境中运行?
EN

Stack Overflow用户
提问于 2014-03-02 23:50:54
回答 4查看 2.7K关注 0票数 5

我有一个简单的新Rails 4应用程序,它在运行rake test:units时会破坏开发数据库,尽管我已经在test_helper.rb中设置了RAILS_ENV。我没想到会这样。以下是复制它的简单步骤。

我有Ruby2.0.0p247和Rails 4.0.1。

代码语言:javascript
复制
rails new foo
rails generate scaffold gadget
rake db:migrate

我编辑test/model/gadget_test.rb如下所示:

代码语言:javascript
复制
require 'test_helper'

class GadgetTest < ActiveSupport::TestCase
  test "the env" do
    assert_equal "test", Rails.env
  end
end

我编辑了test/test_helper.rb的第一行

代码语言:javascript
复制
ENV["RAILS_ENV"] ||= "test"

成为

代码语言:javascript
复制
ENV["RAILS_ENV"] = "test"

即便如此,当测试调用rake test:units时,它还是失败了:

代码语言:javascript
复制
  1) Failure:
GadgetTest#test_the_env test/models/gadget_test.rb:5]:
Expected: "test"
  Actual: "development"

对于我已经设置的旧应用程序(Rails 3),我可以依赖这个默认的测试环境。我遗漏了什么?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2014-09-04 11:09:04

真正的答案是:我的个人资料引用的shell脚本中有一个偏离的export RAILS_ENV="development"。这是一个座位到键盘的接口故障,直接从2013年10月31日在这个线程:https://github.com/rails/rails/issues/7175

你要做的就是把它拿出来,问题就解决了。

票数 1
EN

Stack Overflow用户

发布于 2014-03-04 03:53:56

谜团解开了,给j_mcnally顶了个大大的帽子!

要强制Rails env在Rails 4(可能更早)中进行“测试”,将test_helper.rb的第一行更改为

代码语言:javascript
复制
ENV["RAILS_ENV"] = "test"

这无法重置Rails.env的缓存值,但如果您调用

代码语言:javascript
复制
Rails.env = "test"

它将正确地重置缓存的值。也就是说,还有其他地方已经在调用Rails.env,否则缓存将不会被设置。一个显而易见的问题是application.rb中的绑定程序设置,其中它有Bundler.require(:default, Rails.env),并将其更改为Bundler.require(:default, ENV['RAILS_ENV']) (以避免设置缓存)仍然表明初始化中的其他位置也必须调用Rails.env。所有这些的意义在于,一些设置将认为它正在开发中运行,然后测试将在“测试”环境中运行。

网答:我有办法得到我想要的,但可能仍然有一些危险的地方潜伏在那里。

票数 6
EN

Stack Overflow用户

发布于 2014-06-21 19:34:56

确保require 'rails/test_unit/railtie'行在config/application.rb中不被注释掉

我也遇到了同样的问题,我尝试使用Minitest作为TestUnit的替代品,生成了没有它的rails应用程序(rails new foobar --skip-test-unit),但是Minitest仍然使用Rails的测试任务。

我在config/applicaiton.rb中有以下代码

代码语言:javascript
复制
# require 'rails/test_unit/railtie'

# Require the gems listed in Gemfile, including any gems
# you've limited to :test, :development, or :production.
Bundler.require(*Rails.groups)

正如j_mcnally和Fitter所指出的,问题是Rails.envENV['RAILS_ENV']设置之前缓存了它的值,在我的例子中,它是在Rails.groups中被调用的。

为了在Rails源代码中找到在调用rake任务时如何设置适当的test env,我发现它是在被注释掉的rails/test_unit/railtie.rb中设置的。

因此,解决方案就像取消注释require 'rails/test_unit/railtie'行一样简单。

希望这能有所帮助。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22135347

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档