編集: 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