Ответ 1
Используйте Guard для перезагрузки Spork при обновлении своих классов Guard:: Spork позволяет автоматически и разумно запускать/перезагружать сервер RSpec/Cucumber Spork.
Я использую spork весь день, и большую часть времени это действительно здорово.
Тем не менее, я часто сталкиваюсь с несколькими проблемами, когда мне нужно перезапустить Spork для того, чтобы мои тесты прошли... и теперь мне интересно, есть ли больше проблем, чем это стоит. Я новичок в ruby, поэтому иногда я не могу предсказать, вызвана ли ошибка из-за проблемы с обновлением, или если ошибка связана с моей незнакомостью с Ruby и Rails.
Что мне нужно добавить в Spork.each_run, чтобы мои проверки и другие вещи были обновлены, так что мне не нужно перезапускать spork-сервер?
Спасибо
Используйте Guard для перезагрузки Spork при обновлении своих классов Guard:: Spork позволяет автоматически и разумно запускать/перезагружать сервер RSpec/Cucumber Spork.
EDIT: Если вы можете перейти на Ruby 2.0, это лучший выбор. Это достаточно быстро и позволит вам работать регулярно, без необходимости в таких инструментах, как Spork, Zeus и ect. И в сущности вам не понадобится ничего, что я написал ниже.
Если вам по-прежнему нужен некоторый удар скорости при разработке, проверьте Fast Rails Commands.
Ну да, вы хотите перезагрузить Spork, если вы изменили файлы среды, инициализатора или spec_helper (и для этого защитного spork идеально), но не тогда, когда вы обновили один из своих классов (моделей), поскольку это отрицает цель такие инструменты, как spork. У меня была такая же проблема: я мог удалить все методы в модели, и тесты все равно пройдут, потому что Spork проведет "старый" класс модели в памяти. Необходима перезагрузка Spork.
Причина:
Некоторые плагины приводят к тому, что код модели предварительно загружается, поэтому требуется некоторая работа, чтобы блокировать это.
Вы хотите предотвратить предварительную загрузку кода модели, поскольку это не будет "перезагружать" их, если вы внесете какие-либо изменения (например, с проверками).
Решения:
Зависит от драгоценных камней, которые задействованы. В моем случае мне приходилось иметь дело с Devise и FactoryGirl, но, по сути, вы делаете это, используя Spork.trap_method, как описано в wiki: 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, вы можете попробовать интересную альтернативу: Zeus - https://github.com/burke/zeus
Небольшой snafu останется, однако. Если вы обновляете приложение /models/person.rb, изменение не вступит в силу в ваших тестах так как у Spork есть старая Личность в памяти. Один из способов - это edit config/environment/test.rb и изменить:
config.cache_classes = true
To:
config.cache_classes = false
В более поздних версиях Factory Girl вам не нужно много делать. Сначала добавьте FactoryGirl.reload
в Spork.each_run
. Если у вас есть фабрики с параметром class
, они должны быть строковыми.
factory :my_model, class: 'MyModel' do...
вместо
factory :my_model, class: MyModel do...