23

我一直在使用 Michael Hartl 的Rails 教程来学习 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)。

谢谢你的帮助!

4

4 回答 4

58

spec/spec_helper.rb可能有问题。用https://github.com/railstutorial/sample_app_rails_4/blob/master/spec/spec_helper.rb替换你所拥有的,看看是否能解决这个问题。

于 2013-06-26T13:59:08.337 回答
1

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

编辑:啊,我终于明白你的意思了。在对我不起作用的 spec/spec_helper.rb 文件版本中,文件末尾有一大堆注释从我的文本编辑器底部运行,在这些注释之后还有另一个 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

这就是待定测试的来源。

于 2013-07-31T15:00:28.283 回答
0

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

于 2014-01-09T16:11:43.403 回答
0

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

于 2014-04-06T03:29:20.317 回答