【问题标题】:How to know if Spork is running如何知道 Spork 是否正在运行
【发布时间】:2010-10-08 15:07:08
【问题描述】:

我正在尝试在带有 spork 的 rails 2.3.8 应用程序中加快“rspecing”。当我在项目的根目录中运行 spork 时,我得到:

(...stuff...)
No server is running
Running specs locally:
Spork is ready and listening on 8989!

然后,如果我运行规范,消息

 No server is running 
 Running specs locally 

如果我在没有 Spork 的情况下运行它们不会出现,但是规范启动与没有 Spork 的情况一样慢。同样在 Spork 的终端中,没有进一步的输出出现。

我的问题是,spork 真的在运行吗?如果是这样,规范是否在那里运行?最后,如果两者的答案都是正确的,我怎样才能加快我的测试?

这里是涉及的配置文件:

spec/spec.opts

  --colour
  --format progress
  --loadby mtime
  --reverse
  --drb

spec/spec.helper

require 'rubygems'
require 'bundler/setup'
require 'spork'


Spork.prefork do

   ENV["RAILS_ENV"] ||= 'test'
   require File.expand_path(File.join(File.dirname(__FILE__),'..','config','environment'))
   require 'spec/autorun'
   require 'spec/rails'

   Dir[File.expand_path(File.join(File.dirname(__FILE__),'support','**','*.rb'))].each {|f| require f}

   Spec::Runner.configure do |config|
  end


 end

 Spork.each_run do

end

而且,要问一个完整的问题,这里是用“时间”衡量的时间:

带叉:

real    0m39.524s
user    0m5.012s
sys  0m0.912s

没有Spork:

real    0m39.576s
user    0m18.537s
sys  0m2.400s

当跑步运动时--诊断我得到

 - Spork Diagnosis -
 -- Summary --
 config/boot.rb
 config/initializers/inflections.rb
 config/initializers/mime_types.rb
 config/initializers/new_rails_defaults.rb
 config/initializers/site_keys.rb
 config/preinitializer.rb
 spec/spec_helper.rb

然后,对于

 --- config/initializers/inflections.rb ---
 --- config/initializers/mime_types.rb ---
 --- config/initializers/new_rails_defaults.rb ---
 --- config/initializers/site_keys.rb ---

以下堆栈跟踪

 /var/lib/gems/1.8/gems/activesupport-2.3.8/lib/active_support/dependencies.rb:147:in `load'
 /var/lib/gems/1.8/gems/rails-2.3.8/lib/initializer.rb:622:in `load_application_initializers'
 /var/lib/gems/1.8/gems/rails-2.3.8/lib/initializer.rb:621:in `each'
 /var/lib/gems/1.8/gems/rails-2.3.8/lib/initializer.rb:621:in `load_application_initializers'
 /var/lib/gems/1.8/gems/rails-2.3.8/lib/initializer.rb:176:in `process'
 /var/lib/gems/1.8/gems/rails-2.3.8/lib/initializer.rb:113:in `send'
 /var/lib/gems/1.8/gems/rails-2.3.8/lib/initializer.rb:113:in `run_without_spork'
 /var/lib/gems/1.8/gems/spork-0.8.4/lib/spork/app_framework/rails.rb:18:in `run'
 config/environment.rb:15
 spec/spec_helper.rb:14:in `require'
 spec/spec_helper.rb:14
 /var/lib/gems/1.8/gems/spork-0.8.4/bin/../lib/spork.rb:23:in `prefork'

spec/spec_helper.rb:6

【问题讨论】:

  • 就像童谣中所说的那样,“......然后,spork 和 foon 一起跑了。” </non-sequitur>

标签: ruby-on-rails ruby rspec spork


【解决方案1】:

我遇到了同样的问题,这是我能够弄清楚的。

在 lib/tasks/rspec.rake 的第 50 行附近,您会发现以下行。

spec_prereq = File.exist?(File.join(RAILS_ROOT, 'config', 'database.yml')) ? "db:test:prepare" : :noop

这导致 db:test:prepare 在您的规范之前运行,这反过来会加载环境,从而破坏了 spork 的全部目的。我注释掉了这一行,并在其下方添加了以下内容。

spec_prereq = :noop

此更改应该会带来相当多的改进。运行 db:migrate 后,您必须手动运行 db:test:prepare。我有一个命令可以两者兼得。

我不知道您是否在使用 Bundler,但我看到升级到最新版本 (1.0.7) 后速度有所提升。 (Bundler 在 2.3.x 中加载 Rake 时设置加载路径)

由于 spork、rake 和 bundler 的开销,我仍然有大约 2.5 秒的延迟,我希望将来可以改进,也许当 spork 支持 rails 3 时。

【讨论】:

  • 好的,我会尝试并报告,只有一个问题:如果在 spork 启动时完成,这不可行吗?
  • 我终于可以试一试并确认你是对的,现在我要考虑做 db:test:prepare on spork load :)
【解决方案2】:

启用 spork 所需的操作如下:-

  1. --drb 添加到 spec/spec.opts 以告诉 spec 使用 drb 与 spork 通信。
  2. 使用spork --bootstrap 引导spork
  3. 修改 spec/spec_helper.rb 以设置 spork

这三个步骤你都完成了吗?

更多信息请见here

【讨论】:

  • 是的,我用这些文件的内容更新了问题
【解决方案3】:

您的设置对我来说看起来不错。输出不足是正常的。

你试过spork --diagnose吗?它应该会列出所有文件 spork 预加载的列表。

【讨论】:

  • 将在星期一尝试并报告任何发现:)
  • 确认一下,在没有 spork 的情况下,您会收到“没有服务器正在运行”消息,而在 spork 正在运行 运行时没有消息,对吗?
猜你喜欢
  • 2013-09-19
  • 1970-01-01
  • 1970-01-01
  • 2012-07-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多