Spork / Autotest не получает изменения автоматически - PullRequest
2 голосов
/ 30 августа 2011

Я просто работаю над своим первым приложением rails, следуя инструкции по http://ruby.railstutorial.org/. Я настроил свою среду разработки в точности так, как сказано в руководстве (я использую Macbook Pro с Lion)и это работает без каких-либо проблем, за исключением одного сбоя.Сначала я пишу неудачные тесты, затем вносю изменения в код, чтобы они прошли, я могу проверить в браузере, что страницы работают правильно, но по какой-то причине результаты теста по-прежнему «красные».У меня есть терминал, работающий с 3 вкладками, первая вкладка, где у меня работает spork (bundle exec spork), вторая вкладка, где у меня работает сервер rails (rails s) и третья вкладка, где я делаю все изменения командной строки и запускаю тесты (автотест|| bundle exec rspec spec /).Я должен перезапустить сервер spork, rails, а затем снова протестировать, чтобы увидеть, что они становятся «зелеными».

Это ожидаемое поведение?Потому что в соответствии с уроками в большинстве случаев я должен видеть, что они становятся зелеными, без перезапуска сервера / spork.

РЕДАКТИРОВАТЬ

Это то, что мойФайл spec_helper.rb выглядит как

require 'rubygems'
require 'spork'

Spork.prefork do
  # Loading more in this block will cause your tests to run faster. However,
  # if you change any configuration or code from libraries loaded here, you'll
  # need to restart spork for it take effect.

  ENV["RAILS_ENV"] ||= 'test'
  require File.expand_path("../../config/environment", __FILE__)
  require 'rspec/rails'


  # Requires supporting files with custom matchers and macros, etc,
  # in ./support/ and its subdirectories.
  Dir[Rails.root.join("spec/support/**/*.rb")].each {|f| require f}

  RSpec.configure do |config|
    # == Mock Framework
    #
    # If you prefer to use mocha, flexmock or RR, uncomment the appropriate line:
    #
    # config.mock_with :mocha
    # config.mock_with :flexmock
    # config.mock_with :rr
    config.mock_with :rspec

    config.fixture_path = "#{::Rails.root}/spec/fixtures"

    # If you're not using ActiveRecord, or you'd prefer not to run each of your
    # examples within a transaction, comment the following line or assign false
    # instead of true.
    config.use_transactional_fixtures = true
  end

end

Spork.each_run do
  # This code will be run each time you run your specs.
end

Спасибо за совет!

Ответы [ 6 ]

17 голосов
/ 18 сентября 2011

Я только что столкнулся с той же проблемой, пытаясь настроить среду с помощью spork и watchr, и нашел решение (по крайней мере, в моем случае) здесь: http://www.rubyinside.com/how-to-rails-3-and-rspec-2-4336.html

Редактировать config/environments/test.rb

Изменение

config.cache_classes = true

до

config.cache_classes = false

Это должно заставить spork забирать изменения в ваших контроллерах и моделях без перезапуска.

Edit:

С тех пор я столкнулся с проблемами, когда для cache_classes установлено значение false (это вызывало проблемы с машинистом и огурцом - как ни странно, rspec и машинист были в порядке).

В любом случае, кажется, есть лучшее решение (взято отсюда: http://ablogaboutcode.com/2011/05/18/spork-rspec-sham-and-caching-classes/ и здесь: http://mikbe.tk/2011/02/10/blazingly-fast-tests/), то есть добавление следующего кода в ваш блок Spork.each_run

Spork.each_run do
  ActiveSupport::Dependencies.clear
  ActiveRecord::Base.instantiate_observers

  load "#{Rails.root}/config/routes.rb"
  Dir["#{Rails.root}/app/**/*.rb"].each { |f| load f }  
end if Spork.using_spork?
1 голос
/ 29 апреля 2012

Если вы используете spork rc 1.0, вам нужно вместо этого использовать 'spork-rails'.

Исправлены проблемы с перезагрузкой контроллеров для меня.Благодаря этому сообщению.

http://blog.firsthand.ca/2012/02/heads-up-use-spork-rails-if-you-want-to.html

1 голос
/ 30 августа 2011

Работает ли это, если вы запустите тест без изменений?Я имею в виду, что он «забирает» ваши изменения?

Если это так, откройте блок spec_helper.rb и измените each_run, чтобы он загружал ваши требования к тестам каждый раз, а не только один раз, какгрузы.

0 голосов
/ 24 декабря 2013

В ответ на ответ Сэма Мирси в новых версиях Rails устарел instantiate_observers, и удаление этой строки все равно дает желаемый результат:

Spork.each_run do
  ActiveSupport::Dependencies.clear

  load "#{Rails.root}/config/routes.rb"
  Dir["#{Rails.root}/app/**/*.rb"].each { |f| load f }  
end if Spork.using_spork?
0 голосов
/ 20 декабря 2011

Я прошёл тот же урок и столкнулся с той же проблемой. Вот что сработало для меня:

  1. Обновите файл «spec / spec_helper.rb», чтобы изменить, изменив раздел «Spork.prefork» на:

    Spork.prefork do
    
      # Loading more in this block will cause your tests to run faster. However,
      # if you change any configuration or code from libraries loaded here, you'll 
      # need to restart spork for it take effect.
    
      ENV["RAILS_ENV"] ||= 'test'
      require File.expand_path("../../config/environment", __FILE__)
      require 'rspec/rails'
    
      # Requires supporting files with custom matchers and macros, etc, 
      # in ./support/ and its subdirectories. Dir[Rails.root.join("spec/support/**/*.rb")].each {|f| require f}
    
      RSpec.configure do |config|
    
      # == Mock Framework
      #
      # If you prefer to use mocha, flexmock or RR, uncomment the appropriate line: #
      # config.mock_with :mocha
      # config.mock_with :flexmock 
      # config.mock_with :rr config.mock_with :rspec
          config.fixture_path = "#{::Rails.root}/spec/fixtures"
    
      # If you're not using ActiveRecord, or you'd prefer not to run each of your 
      # examples within a transaction, comment the following line or assign false 
      # instead of true.
    
      config.use_transactional_fixtures = true
      end  
    
    end
    
  2. Обновите файл 'config / environment / test.rb', изменив его:

    config.cache_classes = true
    

    Кому:

    config.cache_classes = false
    

Это второй момент, который не упоминается в книге. Я понял это путем перекрестных ссылок на другие вопросы StackOverflow. В моем случае, перед отключением «config.cache_classes», любые изменения, которые я внесу в контроллер, приведут к запуску набора тестов, но это не будет учитывать изменения. Это может привести к ложным срабатываниям и ложным отрицаниям в зависимости от последнего запуска теста. После отключения настройки тесты забирают мои изменения и, насколько я могу судить, предоставляют действительные индикаторы прохождения / неудачи.


Обратите внимание, что если файл views (.erb) прошел тест один раз, он, похоже, не будет снова поднят, если вы измените его. Однако, если представление не удается, Spork, похоже, продолжает наблюдать за изменениями, пока он не пройдет.

0 голосов
/ 30 августа 2011

в env.rb (файл, который вы создали spork), у вас есть два блока prefork и each_run. Вот вам объяснение, что они делают:

Spork.prefork do
      # Loading more in this block will cause your tests to run faster. However, 
      # if you change any configuration or code from libraries loaded here, you'll
      # need to restart spork for it take effect.
end

и

Spork.each_run do
    # This code will be run each time you run your specs.
end

Я думаю, что это самоописательно;)

...