【问题标题】:Rails 4.0 Spork/ActiveRecord exceptionRails 4.0 Spork/ActiveRecord 异常
【发布时间】:2013-06-26 04:17:35
【问题描述】:

我一直在使用 Michael Hartl 的 Rails Tutorial 来学习 Ruby on Rails,并且最近正在学习新的 Rails 4.0 版本的教程。我遇到了 Spork 的问题;我知道我们正在为 Rails 4.0 兼容性使用 Spork 的自定义分支,这可能只是不同的不兼容性,但我想发布我的问题,看看我是否只是做错了什么或者是否有人有任何想法。每当我在 Spork 运行时调用 RSpec 时,我都会收到 ActiveRecord 异常,而如果我自己调用 RSpec,我的测试会成功运行 - 下面是一个示例终端转储:

oren@VM:~/ruby_projects/test_app$ rspec
Exception encountered: #<ActiveRecord::ConnectionNotEstablished: ActiveRecord::ConnectionNotEstablished>
backtrace:
/home/oren/.rvm/gems/ruby-2.0.0-p195@rails_4_0/gems/activerecord-4.0.0/lib/active_record/connection_adapters/abstract/connection_pool.rb:546:in `retrieve_connection'
/home/oren/.rvm/gems/ruby-2.0.0-p195@rails_4_0/gems/activerecord-4.0.0/lib/active_record/connection_handling.rb:79:in `retrieve_connection'
/home/oren/.rvm/gems/ruby-2.0.0-p195@rails_4_0/gems/activerecord-4.0.0/lib/active_record/connection_handling.rb:53:in `connection'
/home/oren/.rvm/gems/ruby-2.0.0-p195@rails_4_0/gems/activerecord-4.0.0/lib/active_record/migration.rb:792:in `current_version'
/home/oren/.rvm/gems/ruby-2.0.0-p195@rails_4_0/gems/activerecord-4.0.0/lib/active_record/migration.rb:800:in `needs_migration?'
/home/oren/.rvm/gems/ruby-2.0.0-p195@rails_4_0/gems/activerecord-4.0.0/lib/active_record/migration.rb:379:in `check_pending!'
/home/oren/ruby_projects/test_app/spec/spec_helper.rb:105:in `<top (required)>'
/home/oren/.rvm/gems/ruby-2.0.0-p195@rails_4_0/gems/activesupport-4.0.0/lib/active_support/dependencies.rb:222:in `load'
/home/oren/.rvm/gems/ruby-2.0.0-p195@rails_4_0/gems/activesupport-4.0.0/lib/active_support/dependencies.rb:222:in `block in load'
/home/oren/.rvm/gems/ruby-2.0.0-p195@rails_4_0/gems/activesupport-4.0.0/lib/active_support/dependencies.rb:213:in `load_dependency'
/home/oren/.rvm/gems/ruby-2.0.0-p195@rails_4_0/gems/activesupport-4.0.0/lib/active_support/dependencies.rb:222:in `load'
/home/oren/.rvm/gems/ruby-2.0.0-p195@rails_4_0/gems/spork-1.0.0rc3/lib/spork/run_strategy/forking.rb:11:in `block in run'
/home/oren/.rvm/gems/ruby-2.0.0-p195@rails_4_0/gems/spork-1.0.0rc3/lib/spork/forker.rb:21:in `block in initialize'
/home/oren/.rvm/gems/ruby-2.0.0-p195@rails_4_0/gems/spork-1.0.0rc3/lib/spork/forker.rb:18:in `fork'
/home/oren/.rvm/gems/ruby-2.0.0-p195@rails_4_0/gems/spork-1.0.0rc3/lib/spork/forker.rb:18:in `initialize'
/home/oren/.rvm/gems/ruby-2.0.0-p195@rails_4_0/gems/spork-1.0.0rc3/lib/spork/run_strategy/forking.rb:9:in `new'
/home/oren/.rvm/gems/ruby-2.0.0-p195@rails_4_0/gems/spork-1.0.0rc3/lib/spork/run_strategy/forking.rb:9:in `run'
/home/oren/.rvm/gems/ruby-2.0.0-p195@rails_4_0/gems/spork-1.0.0rc3/lib/spork/server.rb:48:in `run'
/home/oren/.rvm/rubies/ruby-2.0.0-p195/lib/ruby/2.0.0/drb/drb.rb:1588:in `perform_without_block'
/home/oren/.rvm/rubies/ruby-2.0.0-p195/lib/ruby/2.0.0/drb/drb.rb:1548:in `perform'
/home/oren/.rvm/rubies/ruby-2.0.0-p195/lib/ruby/2.0.0/drb/drb.rb:1626:in `block (2 levels) in main_loop'
/home/oren/.rvm/rubies/ruby-2.0.0-p195/lib/ruby/2.0.0/drb/drb.rb:1622:in `loop'
/home/oren/.rvm/rubies/ruby-2.0.0-p195/lib/ruby/2.0.0/drb/drb.rb:1622:in `block in main_loop'

我可以根据要求提供我的应用程序中的任何文件,但我不确定什么是最有用的。我基本上遵循了教程第 3 章的前几个步骤(设置新应用程序、添加 StaticPages 控制器、设置 RSpec 和添加第一个规范)和设置 Guard 和 Spork 的说明(第 3.6.2 节和第 3.6 节) .3)。

感谢您的帮助!

【问题讨论】:

  • 你用的是什么数据库?
  • 我在开发和测试环境中使用 SQLite。

标签: ruby-on-rails railstutorial.org spork


【解决方案1】:

您的spec/spec_helper.rb 可能有问题。用 https://github.com/railstutorial/sample_app_rails_4/blob/master/spec/spec_helper.rb 替换您的内容,看看是否可以解决问题。

【讨论】:

  • 就是这样。我没有意识到我必须将现有环境代码 移动Spork.prefork 块中,所以我刚刚将代码从列表 3.37 复制到该块中。这在我猜想把整个事情搞砸的块下面留下了第二个副本。谢谢!
  • 哦,哇,谢谢,同样的问题。我认为说明书不够清楚。
  • 我也遇到了同样的问题,更新了 spec/spec_helper.rb 但不起作用……但是……这是我的错,我确实必须重新启动 spork 服务器。
  • 我在本教程中遇到了同样的问题,但没有意识到他要我用清单 3.37 替换整个文件。
【解决方案2】:

我遇到了同样的问题,但我无法理解您将“现有环境”移动到 Spork.prefork 块中的意思。据我所知,清单 3.37 应该是一个完整的 spec/spec_helper.rb 文件。但是,该文件对我不起作用:我收到“未建立连接错误”。

编辑:啊,我终于明白你的意思了。在对我不起作用的 spec/spec_helper.rb 文件版本中,文件末尾有一大块 cmets 从我的文本编辑器底部运行,在这些 cmets 之后还有另一个 prefork块隐藏。所以你应该做的是复制代码清单 3.37,然后打开 spec/spec_helper.rb 并“全选”,然后粘贴。

另一方面,github 上的 spec/spec_helper.rb 文件确实对我有用。我对这两个文件进行了比较,并且 git hub 版本在 prefork 块的末尾有所不同:

清单 3.37:

    config.order = "random"
    config.include Capybara::DSL
  end
end

github:

    config.order = "random"
    # Include the Capybara DSL so that specs in spec/requests still work.
    config.include Capybara::DSL

    # Disable the old-style object.should syntax.
    config.expect_with :rspec do |c|
      c.syntax = :expect
    end
  end
end

我不明白添加的代码与连接有什么关系,但是在多次尝试清单3.37并得到连接错误后,我将文件更改为github版本,我得到了这个输出:

$ time bundle exec rspec spec/requests/static_pages_spec.rb --drb
........

Finished in 0.19795 seconds
8 examples, 0 failures

Randomized with seed 27433


real    0m5.568s
user    0m3.617s
sys 0m0.832s

然后我将 spec/spec_helper.rb 改回代码清单 3.37 中的版本,我再次遇到连接错误。所以代码 3.37 是行不通的(编辑: 是的,见初始编辑)。

编辑:注意:如果你使用代码清单3.37,你不会得到以下错误:

接下来,在教程中执行了几个步骤后,我注意到 Guard 正在输出测试失败:

Failures:

  1) StaticPagesController GET 'home' returns http success
     Failure/Error: response.should be_success
     NoMethodError:
       undefined method `should' for #<ActionController::TestResponse:0x000001046dba00>
     # ./spec/controllers/static_pages_controller_spec.rb:8:in `block (3 levels) in <top (required)>'

  2) StaticPagesController GET 'help' returns http success
     Failure/Error: response.should be_success
     NoMethodError:
       undefined method `should' for #<ActionController::TestResponse:0x00000104700058>
     # ./spec/controllers/static_pages_controller_spec.rb:15:in `block (3 levels) in <top (required)>'

Finished in 0.24867 seconds
13 examples, 2 failures, 3 pending

这些失败来自使用名为 should() 的方法的自动生成的测试文件,而 github 版本的 spec/spec_helper.rb 文件禁用了该方法:

# Disable the old-style object.should syntax.
config.expect_with :rspec do |c|
  c.syntax = :expect
end

在本教程的前面部分,我们只在一个文件中运行测试:

spec/requests/static_pages_spec.rb

但现在 Guard 和 Spork 已设置为运行所有测试文件中的所有测试。

为了摆脱测试失败,我只是把代码注释掉了:

/spec/controllers/static_pages_controller_spec

Guard 也有一些不同颜色的输出显示:

Pending:
...

教程还没有讲到,但是在测试中你可以写'pending',像这样:

describe StaticPagesHelper do
  pending "add some examples to (or delete) #{__FILE__}"
end

然后当您运行测试时,输出将通过显示“待定”输出来提醒您仍然需要编写测试。如果您查看:

spec/helpers/static_pages_helper_spec.rb

这就是待定测试的来源。

【讨论】:

  • 干得好!我认为本教程指导您在生成 StaticPages 控制器时使用--no-test-framework 选项;这应该会阻止 Rails 自动生成测试文件。祝你好运!
  • @orenyk,本教程说要使用rails new sample_app --skip-test-unit,但后来您发出一些命令来为rspec 配置rails,并且在某个地方,您最终在spec 目录中得到了三个文件。当教程让你手动运行 rspec 时,你指定一个测试文件,但是当你添加 guard/spork 的东西时,spec 目录中的所有文件都会运行。
  • 如果您查看列表 3.4,您会看到创建 StaticPages 控制器时使用了 --no-test-framework 选项,在生成要开始的 rails 项目时使用的 --skip-test-unit 选项之上和。您引用的文件(/spec/controllers/static_pages_controller_spec.rb/spec/helpers/static_pages_helper_spec.rb)似乎是由rails generate controller StaticPages 命令自动生成的,因此--no-test-framework 选项可以防止这种情况发生。
【解决方案3】:

我遇到了同样的错误。我认为这是因为我同时在跑卫和 spork。如果您遵循本教程,它永远不会告诉您在设置 spork 之前退出守卫。如果您执行 exit guard 并仅运行 spork 然后运行此命令,您将不会收到错误消息。本教程的下一步将向您展示如何同时运行 guard 和 spork。

【讨论】:

    【解决方案4】:

    我遇到了同样的问题,几分钟前刚刚解决了这个问题,我的 spec/spec_helper.rb 文件中的所有内容都是准确的,或者我是这么认为的。结果我不得不删除隐藏在底部的文件顶部的这个副本。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-05-09
      • 2012-10-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多