0

Rails 3.1エンジンを開発していて、テストしたいと思います。私はこれにRSpecを使用しており、すべてがうまく機能していますが、Sporkを使用しようとすると、ヘルパーが正しくリロードされないという問題があります。

モデルに関する同様の問題について多くのことを読み、次の可能な修正を思いつきました。

# my_engine/spec/spec_helper.rb

ActiveSupport::Dependencies.clear
ActiveRecord::Base.instantiate_observers

Dir[File.join(File.dirname(__FILE__), '..', 'app', 'helpers', '*.rb')].each do |file|
  require file
end

# my_engine/spec/dummy/config/environments/test.rb
Dummy::Application.configure do
  # ...
  config.cache_classes = !(ENV['DRB'] == 'true') # Ensure that classes aren't cached when using Spork.
  # ...
end

これは、ヘルパーファイルを確実にリロードしている限り機能します(これを確認するためにブレークポイントを追加しました)が、変更はテストに反映されず、Sporkの再起動のみが反映されます。ヘルパーがモジュールであり、テストがモジュールに依存せず、モジュールを実装するクラスに依存しているためか、モジュールは適切に再ロードされますが、適切に混合されていませんか?

現時点では、すべての初期化コードをeach_runブロックに配置しています。

# Configure Rails Environment
ENV["RAILS_ENV"] = "test"

require File.expand_path("../dummy/config/environment.rb", __FILE__)
require 'rspec/rails'

Rails.backtrace_cleaner.remove_silencers!

# Load support files
Dir["#{File.dirname(__FILE__)}/support/**/*.rb"].each { |f| require f }

RSpec.configure do |config|
  config.use_transactional_fixtures = true

  config.treat_symbols_as_metadata_keys_with_true_values = true
  config.filter_run :focus => true
  config.run_all_when_everything_filtered = true
end
4

1 に答える 1

0

私はこのトピックについて多くの調査を行い、次の 2 つのブログ記事に書いています。

require 'rspec/autorun'特に上記の質問に関しては、ブロックに入っていなかったために機能しなかったと想像できますがSpork.prefork、完全にはわかりません。

これが私のspec_helper.rb現在のエンジンです(必要に応じてすべてを正常にリロードします):

require 'rubygems'
require 'spork'

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

  Dir[Rails.root.join("spec/support/**/*.rb")].each {|f| require f}

  RSpec.configure do |config|
    config.use_transactional_fixtures = true
    config.fixture_path = "#{::Rails.root}/spec/fixtures"
    config.infer_base_class_for_anonymous_controllers = false
    config.treat_symbols_as_metadata_keys_with_true_values = true
    config.filter_run :focus => true
    config.run_all_when_everything_filtered = true
  end
end

Spork.each_run do
  # This code will be run each time you run your specs.
end
于 2012-09-27T14:00:14.050 に答える