如何知道Spork是否正在运行

时间:2010-10-08 15:07:08

标签: ruby-on-rails ruby rspec spork

我正试图加速使用spork的rails 2.3.8 app中的“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.opts

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

规格/ 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

而且,为了得到一个完整的问题,这里是用'时间'衡量的时间:

使用Spork:

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 ---

以下stacktrace

 /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_helper.rb:6

3 个答案:

答案 0 :(得分:2)

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

在lib / tasks / rspec.rake的第50行附近,您将找到以下行。

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

这导致db:test:准备在你的规范之前运行,这反过来加载了环境,打败了spork的整个目的。我注释掉了这一行,并在下面添加了以下内容。

spec_prereq = :noop

这种改变应该会带来相当大的改善。在运行db:migrate之后,您必须手动运行db:test:prepare。我有一个同时执行这两个操作的命令。

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

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

答案 1 :(得分:1)

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

  1. --drb添加到spec / spec.opts,告诉规范使用drb与spork进行通信。
  2. 使用spork --bootstrap
  3. 启动spork
  4. 修改spec / spec_helper.rb以设置spork
  5. 你完成了所有这三个步骤吗?

    有更多信息,请here

答案 2 :(得分:0)

您的设置对我来说很好。缺乏产出是正常的。

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