Подтвердить что ты не робот

Spork: как обновить проверки и другой код?

Я использую spork весь день, и большую часть времени это действительно здорово.

Тем не менее, я часто сталкиваюсь с несколькими проблемами, когда мне нужно перезапустить Spork для того, чтобы мои тесты прошли... и теперь мне интересно, есть ли больше проблем, чем это стоит. Я новичок в ruby, поэтому иногда я не могу предсказать, вызвана ли ошибка из-за проблемы с обновлением, или если ошибка связана с моей незнакомостью с Ruby и Rails.

Что мне нужно добавить в Spork.each_run, чтобы мои проверки и другие вещи были обновлены, так что мне не нужно перезапускать spork-сервер?

Спасибо

4b9b3361

Ответ 2

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

Ответ 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:

Небольшой snafu останется, однако. Если вы обновляете приложение /models/person.rb, изменение не вступит в силу в ваших тестах так как у Spork есть старая Личность в памяти. Один из способов - это edit config/environment/test.rb и изменить:

config.cache_classes = true

To:

config.cache_classes = false

Ответ 4

В более поздних версиях Factory Girl вам не нужно много делать. Сначала добавьте FactoryGirl.reload в Spork.each_run. Если у вас есть фабрики с параметром class, они должны быть строковыми.

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

вместо

factory :my_model, class: MyModel do...