19

私は一日中スポークを使用してきました、そしてほとんどの場合それは本当に素晴らしいです。

しかし、テストに合格するためにSporkを再起動する必要があるといういくつかの問題に遭遇することがよくあります...そして今、それが価値以上の問題であるかどうか疑問に思っています。私はrubyを初めて使用するため、エラーの原因が更新の問題なのか、RubyとRailsに慣れていないためなのかを予測できないことがあります。

検証などを更新してsporkサーバーを再起動する必要がないように、Spork.each_runブロックに何を入れる必要がありますか?

ありがとう

4

4 に答える 4

15

編集: Ruby 2.0にアップグレードできる場合は、これが最善の策です。十分に高速で、Spork、Zeus、ectなどのツールを必要とせずに通常の方法で作業できます。そして本質的に、あなたは私が以下に書いたものを何も必要としないでしょう。

開発中にまだスピードバンプが必要な場合は、FastRailsコマンドキャストを確認してください。


はい、環境、初期化子、またはspec_helperファイルを変更した場合(そしてそのためにはguard-sporkが最適です)、Sporkをリロードしたいのですが、クラス(モデル)の1つを更新した場合は、sporkなどのツールの目的が否定されるためです。 。私はまったく同じ問題を抱えていました。Sporkは「古い」モデルクラスをメモリに保持しているため、モデル内のすべてのメソッドを削除しても、テストは引き続き合格します。Sporkを再起動する必要がありました。

理由:

一部のプラグインではモデルコードがプリロードされるため、それをブロックするにはいくつかの作業が必要です。

モデルコードがプリロードされないようにする必要があります。これは、(検証などで)変更を加えた場合にモデルコードが「リロード」されないためです。

ソリューション:

関係する宝石に依存します。私の場合、DeviseとFactoryGirlを処理する必要がありましたが、基本的には、wikiで説明されているSpork.trap_methodを使用して処理します:https ://github.com/sporkrb/spork/wiki/Spork.trap_method-Jujitsu

さらに、実行spork -dしてプリロードされているファイルのリストを取得できます。この問題の原因に関与している可能性のあるgemを追跡すると役立つ場合があります。

例:Rails 3.0.x + Rspec2 + Spork 0.9.0.rcX + Capybara + Devise + FactoryGirl

# spec/spec_helper.rb
Spork.prefork do
  # This file is copied to spec/ when you run 'rails generate rspec:install'
  ENV["RAILS_ENV"] ||= 'test'
  require File.expand_path("../../config/environment", __FILE__)
  require 'rspec/rails'
  require 'capybara/rspec'
  require 'capybara/rails'

  # set "gem 'factory_girl', :require => false" in Gemfile
  require 'factory_girl'

  # deal with Devise
  require "rails/application"
  Spork.trap_method(Rails::Application, :reload_routes!)

  require File.dirname(__FILE__) + "/../config/environment.rb"

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

  RSpec.configure do |config|
    config.mock_with :rspec
    config.use_transactional_fixtures = false
    config.before(:suite) do
      DatabaseCleaner.strategy = :transaction
    end
    config.before(:each) do
      DatabaseCleaner.start
    end
    config.after(:each) do
      DatabaseCleaner.clean
    end

    # Devise controller test helpers:
    config.include Devise::TestHelpers, :type => :controller
  end
end

Spork.each_run do
  # deal with factory girl
  Factory.definition_file_paths = [File.join(Rails.root, 'spec', 'factories')]
  Factory.find_definitions
end

config.cache_classes = trueテスト環境で設定する必要があることに注意してください。設定しtrueないと、FactoryGirlなどのgemからエラーが発生する可能性があります。

これにより、モデルテスト(仕様)がすばやく実行され、ファイルを保存してrspecを起動するたびに「再読み込み」されます。

編集: Ruby 1.9.3で実行している場合は、興味深い代替手段を試すことができます:Zeus- https ://github.com/burke/zeus

于 2011-07-16T07:59:59.070 に答える
14

クラスを更新するときにGuardを使用してSporkをリロードするGuard::Sporkを使用すると、RSpec /CucumberSporkサーバーを自動的かつインテリジェントに起動/リロードできます。

  1. https://github.com/guard/guard-spork
  2. http://flux88.com/2011/04/using-guard-spork-with-mongoid-devise/
于 2011-05-02T15:08:20.113 に答える
3

http://www.rubyinside.com/how-to-rails-3-and-rspec-2-4336.html?utm_source=feedburner&utm_medium=feed&utm_campaign=Feed%3A+RubyInside+%28Ruby+Inside%29から:

ただし、マイナーなスナフは残ります。app / models / person.rbを更新すると、Sporkには古いPersonがまだメモリに残っているため、変更はテストで有効になりません。これを回避する1つの方法は、config / environment / test.rbを編集して、以下を変更することです。

config.cache_classes = true

に:

config.cache_classes = false
于 2011-05-02T10:17:49.593 に答える
2

Factory Girlの最新バージョンでは、多くのことを行う必要はありません。まず、を追加FactoryGirl.reloadSpork.each_runます。パラメータを持つファクトリがある場合class、それらは文字列である必要があります。

factory :my_model, class: 'MyModel' do...

それ以外の

factory :my_model, class: MyModel do...

于 2013-01-11T00:05:01.127 に答える