11

私は次の宝石とを使用していますruby-1.9.3-p194

  • レール3.2.3

  • rspec-rails 2.9.0

  • スポーク 1.0.0rc2

  • ガードスポーク 0.6.1

使用されている gem の完全なリストは、このGemfile.lockまたはGemfileにあります。

そして、私はこの構成ファイルを使用しています:

モデル(またはカスタムバリデーターapp/validatorsなど)を変更すると、コードのリロードが機能しません。

つまり、spec を実行すると (ガード コンソールで Enter キーを押すと)、Spork に「古いコード」が含まれており、古いエラー メッセージが表示されました。しかし、Guard と Spork を手動で再起動すると (CTRC-C CTRL-d ガード)、すべて正常に動作します。しかし、数回で疲れてきます。

質問:

誰かが私の設定ファイルを見て、コードの更新をブロックするエラーを修正してください。

それとも、これは最新のRailsバージョンの問題でしょうか?


PS この問題は、一部のプロジェクト (および一部のプロジェクト以外) で何度も繰り返されます。しかし、なぜこれが起こるのか、私はまだ理解していません。

PS2 おそらくこの問題は何か関係があるのActiveAdminでしょうか? コードでファイルを変更すると、app/adminリロードされます。

4

7 に答える 7

8

回避策:

# config/environments/test.rb
config.cache_classes = false

しかし、それは「もろ刃の剣」です。

仕様の実行時間が最大 2.0 倍長くなりました。それでも、Spork を何度も再起動するよりは高速です。


更新 28.06.2013

ゼウスを使用。それは完全に機能します。ベンチマークは一番下に..

使用している場合は、1.9.3アプリの読み込みを本当に高速化する特別なパッチをインストールすることを検討してください。

RVM パッチセット

rbenv 命令

背景とベンチマーク:

非常に大きな1.9.3アプリがあり、アプリの読み込みを高速化したいのですが、Spork が機能しないため、他のソリューションを探し始めました。

アプリの読み込みにかかる時間を確認するために空の仕様を作成します

-/spec/empty_spec.rb

require 'spec_helper'

describe 'Empty' do

end

プレーン1.9.3

time rspec spec/empty_spec.rb 64,65s user 2,16s system 98% cpu 1:07,55 total

1.9.3 + rvm パッチセット

time rspec spec/empty_spec.rb 17,34s user 2,58s system 99% cpu 20,047 total

1.9.3 + rvm パッチセット + zeus

time zeus test spec/empty_spec.rb 0,57s user 0,02s system 58% cpu 1,010 total [うぉぉぉぉぉぉぉぉぉぉぉ!]

于 2012-04-26T14:46:16.673 に答える
7

または、モデル、コントローラー、およびその他のコードにガードを追加することもできます。これらのファイルのいずれかが変更されると、ガードがスポークをリロードします。

guard 'spork',
      :rspec_env => {'RAILS_ENV' => 'test'} do
  watch(%r{^app/models/(.+)\.rb$})
  watch(%r{^lib/(.+)\.rb$})
end
于 2012-04-26T14:54:43.630 に答える
5

私も同じ問題を抱えていました。model_spec.rb への変更について、テストがリロードされ、正常に実行されました。model.rb ファイルを変更すると、テストが再実行されましたが、コードがキャッシュされているように見えたため、変更は適用されませんでした。

物事を機能させるには、いくつかの答えを組み合わせる必要がありました。

# /config/environments/test.rb
config.cache_classes = !(ENV['DRB'] == 'true')

# spec_helper.rb
Spork.each_run do
  .....
  ActiveSupport::Dependencies.clear
end

また、上記の @23inhouse で言及されているように、spork を (1.0.0rc3) に更新し、spork gem を spork-rails に置き換えました。ただし、spork をアップグレードすると効果があった可能性がありますが、gemfile 内のどちらの gem にも違いは見られませんでした。

願わくば、これが他の誰かが壁に頭をぶつけて何時間も費やすのを防ぐのに役立つことを願っています.

于 2013-07-02T16:23:43.073 に答える
4

Spork は素晴らしいですが、Rails をアップグレードするたびに壊れてしまうようです :(

Rails 3.2.3 では、このスニペットを spec/spec_helper.rb に追加して、アプリ ディレクトリ内のすべての ruby​​ ファイルを強制的に再読み込みします。

Spork.each_run do
  # This code will be run each time you run your specs.
  Dir[Rails.root + "app/**/*.rb"].each do |file|
    load file
  end
end
于 2012-06-26T09:13:46.890 に答える
3

私の場合、問題はドレーパーでした。spork がモデルをリロードできませんでした。

Spork.prefork do
  ENV['RAILS_ENV'] ||= 'test'

  # Routes and app/ classes reload
  require 'rails/application'
  Spork.trap_method(Rails::Application::RoutesReloader, :reload!)
  Spork.trap_method(Rails::Application, :eager_load!)

  # Draper preload of models
  require 'draper'
  Spork.trap_class_method(Draper::System, :load_app_local_decorators)

  # Load railties
  require File.expand_path('../../config/environment', __FILE__)
  Rails.application.railties.all { |r| r.eager_load! }
  ...

環境をロードする前に、Draper のトラップ メソッドを挿入することを忘れないでください。

于 2012-07-31T17:21:47.500 に答える
2

Spork がクリーンアップされ、いくつかの機能が抽出されました。

https://github.com/sporkrb/spork-rails

これを Gemfile に追加します

gem 'spork-rails'

于 2013-01-25T02:03:06.977 に答える
0

spork.each_run メソッドにさらに追加することで、同じ問題を修正しました。

レール 3.2.2

また、一度に 1 つのテストを実行することをお勧めします。はるかに高速でノイズが少なく、通常は一度に 1 つのテストに取り組みます。

rspec spec -e 'shows answer text'

Guard が終了するのをただ座って待っていたので、Guard を使用するよりも速くて簡単だと思います。また、Guard は常に正しいファイルをリロードし、変更を行ったときに正しいテストを実行するとは限りませんでした。

spec_helper.rb ファイル:

require 'spork'

Spork.prefork do
  ENV['RAILS_ENV'] ||= 'test'

  require File.expand_path('../../config/environment', __FILE__)
  require 'rspec/rails'
  require 'rspec/autorun'
  require 'capybara/rspec'
  require 'capybara/rails'

  # Requires supporting ruby files with custom matchers and macros, etc,
  # in spec/support/ and its subdirectories.
end

Spork.each_run do
  Dir[Rails.root.join('spec/support/**/*.rb')].each {|f| require f}

  RSpec.configure do |config|
    # config.mock_with :mocha
    # config.mock_with :flexmock
    # config.mock_with :rr
    config.mock_with :rspec

    # Remove this line if you're not using ActiveRecord or ActiveRecord fixtures
    config.fixture_path = "#{::Rails.root}/spec/fixtures"

    # If you're not using ActiveRecord, or you'd prefer not to run each of your
    # examples within a transaction, remove the following line or assign false
    # instead of true.
    config.use_transactional_fixtures = true

    # If true, the base class of anonymous controllers will be inferred
    # automatically. This will be the default behavior in future versions of
    # rspec-rails.
    config.infer_base_class_for_anonymous_controllers = false

    config.include RequestHelpers, :type => :request

    config.before :suite do
      DatabaseCleaner.strategy = :truncation
      DatabaseCleaner.clean_with :truncation
    end

    config.before :each do
      DatabaseCleaner.start
    end

    config.after :each do
      DatabaseCleaner.clean
    end

    config.include(MailerHelpers)
    config.before(:each) { reset_email }
  end
  # This code will be run each time you run your specs.
end
于 2012-08-12T20:06:19.440 に答える