13

Spork テスト サーバーに問題があります。

config/environments/test.rb で config.cache_classes = false を設定すると、スペックでエラーが発生し始めます。

Failure/Error: task = Factory(:something, :foo => @foo, :bar => @bar)
     DataMapper::ImmutableError:
       Immutable resource cannot be modified

これは私のspec_helper.rbです:

require 'spork'

Spork.prefork do
  if ENV['CODE_COVERAGE'] == '1'
    require 'simplecov'
    SimpleCov.start 'rails'
  end

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

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

  RSpec.configure do |config|
    config.mock_with :mocha
    config.include Rails.application.routes.url_helpers
    config.include UrlHelper

    config.before(:each) do
      repository(:default) do
        transaction = DataMapper::Transaction.new(repository)
        transaction.begin
        repository.adapter.push_transaction(transaction)
      end
    end

    config.after(:each) do
      repository(:default).adapter.pop_transaction.try(:rollback)
    end

  end
end

# This code will be run each time you run your specs.
Spork.each_run do
  # reload factories
  Factory.definition_file_paths = Dir[File.join(Rails.root, "spec", "factories")]
  Factory.find_definitions

  DatabaseCleaner.strategy = :truncation
  DatabaseCleaner.clean
  LoggedEvent.all.destroy!

end

config.cache_classes = true の場合、すべてが正常に機能しますが、モデル、コントローラー クラスがリロードされないため、この場合に spork を使用しても意味がありません。

キャッシュがtrueの場合、spec_helper.rbに次のようなものを追加しようとしました:

Spork.each_run do
    Dir.glob("#{Rails.root}/app/models/*.rb").sort.each { |file| load file }
end

しかし、私はこの解決策が好きではありません。

4

3 に答える 3

20

追加するだけです:

ActiveSupport::Dependencies.clear

プリフォークブロックの最後まで。これにより、モデルがクリアされます。

また、その rspec 構成インクルージョンを Spork.each_run に移動する必要があります。仕様サポートと共有ファイルが必要な場合も同様です。

これは機能します。私はこのセットアップを 2 つのプロジェクトで問題なく使用しています。

于 2011-05-20T16:35:22.193 に答える
8

ActionDispatch::Reloader を試す

config.cache_classes = falseの設定に加えてconfig/environments/test.rb、次のようにすると、DataMapper と Spork がチームにとってうまく機能するようです。

Spork.each_run do

  # Routes
  MyApp::Application.reload_routes!

  if Spork.using_spork?
    # Reload all app files
    ActionDispatch::Reloader.cleanup!
    ActionDispatch::Reloader.prepare!

    # All factories
    FactoryGirl.reload
  end

end
于 2012-05-23T19:09:34.023 に答える
0

こんにちは、テストを再度実行するのに何が役立ったかを共有したいと思いました。スポークが接続が失われたと不平を言って
いたので、トリックを追加しなければならなかったことがわかりました。 この後、モデルをキャッシュしていたため、ブロックの最後で行をシフトする必要がありました。shared_connection
dependency.clear

Spork.each_run do
  # ActiveSupport::Dependencies.clear # <-- moved this line at end of block as suggested by @solnic
  ActiveRecord::Base.instantiate_observers
  MyApp::Application.reload_routes!
  FactoryGirl.reload

  class ActiveRecord::Base
    mattr_accessor :shared_connection
    @@shared_connection = nil

    def self.connection
      @@shared_connection || retrieve_connection
    end
  end
  ActiveRecord::Base.shared_connection = ActiveRecord::Base.connection

  ActiveSupport::Dependencies.clear # <-- line moved here

end if Spork.using_spork?
于 2013-03-15T13:51:31.797 に答える