Spork: как обновить проверки и другой код? - PullRequest
19 голосов
/ 02 мая 2011

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

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

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

Спасибо

Ответы [ 4 ]

15 голосов
/ 16 июля 2011

РЕДАКТИРОВАТЬ: Если вы можете обновить до 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

14 голосов
/ 02 мая 2011

Используйте Guard для перезагрузки Spork при обновлении классов Guard :: Spork позволяет автоматически и интеллектуально запускать / перезагружать сервер (ы) RSpec / Cucumber Spork.

  1. https://github.com/guard/guard-spork
  2. http://flux88.com/2011/04/using-guard-spork-with-mongoid-devise/
3 голосов
/ 02 мая 2011

С 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 все еще находится в памяти.Одним из способов решения этой проблемы является редактирование config / environment / test.rb и изменение:

config.cache_classes = true

На:

config.cache_classes = false
2 голосов
/ 11 января 2013

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

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

вместо

factory :my_model, class: MyModel do...

...