РЕДАКТИРОВАТЬ: Если вы можете обновить до Ruby 2.0, это ваш лучший выбор.Это достаточно быстро и позволит вам работать в обычном режиме без использования таких инструментов, как Spork, Zeus и т. Д.И по сути вам не понадобится ничего, что я написал ниже.
Если вам все еще нужно некоторое увеличение скорости во время разработки, проверьте Fast Rails Commands cast.
Ну да, вы хотите перезагрузить Spork, если вы изменили средуФайлы инициализатора или spec_helper (и для этого guard-spork идеально подходит), но не при обновлении одного из ваших классов (моделей), так как это отрицает назначение таких инструментов, как spork.У меня была та же проблема: я мог удалить все методы в модели, и тесты все равно проходили бы, потому что Spork удерживал в памяти «старый» класс модели.Перезапуск Spork не потребовался.
Причина:
Некоторые плагины вызывают предварительную загрузку кода модели, поэтому требуется некоторая работа, чтобы этого не произошло.
Вы хотите предотвратить предварительную загрузку кода модели, поскольку это не "перезагрузит" их, если вы внесете какие-либо изменения (например, с проверками).
Решения:
Зависит от драгоценных камней, которые участвуют.В моем случае мне приходилось иметь дело с Devise и FactoryGirl, но по сути вы делаете это с помощью Spork.trap_method, как описано в вики: https://github.com/sporkrb/spork/wiki/Spork.trap_method-Jujitsu
Кроме того, вы можете запустить spork -d
, чтобы получить списокпредварительно загруженных файлов может быть полезно отследить, какие драгоценные камни могут быть связаны с этой проблемой.
Пример: 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.
Это сделало мои модельные тесты (спецификации)запускать быстро и «перезагружать» их каждый раз, когда я сохраняю файл и запускаю rspec.
EDIT: Если вы работаете на Ruby 1.9.3, вы можете попробовать интересную альтернативу:Зевс - https://github.com/burke/zeus