2011-05-06 13 views
13

मुझे स्पार्क परीक्षण सर्वर में कोई समस्या है।rspec, factory_girl और डेटामैपर के साथ स्पार्क और कैश_क्लास समस्या

यदि मैं config.cache_classes = config/वातावरण/test.rb में गलत सेट करता हूं तो चश्मा rasie त्रुटियों से शुरू होता है।

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 है = सच है, तो सब कुछ अच्छी तरह से काम करता है, लेकिन यह मुझे एक मॉडल, नियंत्रकों कक्षाएं फिर से लोड नहीं है, इसलिए मैं डॉन ' इस मामले में स्पार्क का उपयोग करने में एक बिंदु नहीं देखते हैं।

मैं कुछ इस तरह spec_helper.rb, जब कैश सच है जोड़ने की कोशिश की:

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

लेकिन मैं इस समाधान पसंद नहीं है।

उत्तर

20

बस जोड़ें:

ActiveSupport::Dependencies.clear 

prefork ब्लॉक के अंत तक। यह मॉडल को साफ़ करने का ख्याल रखेगा।

इसके अलावा, आप उस rspec को Spork.each_run में शामिल करने के लिए कॉन्फ़िगर करना चाहते हैं, वैसे ही spec समर्थन और साझा फ़ाइलों की आवश्यकता होती है।

यह काम करता है, मैं ओ किसी भी मुसीबतों/डब्ल्यू 2 परियोजनाओं में इस स्थापना का उपयोग करें।

+3

रुको, तो 'ActiveSupport :: Dependencies.clear' prefork या each_run में है? मैंने विरोधाभासी कहानियां देखी हैं। न तो मेरे लिए काम करना प्रतीत होता है, दोनों लोडिंग मुद्दों को जन्म देते हैं: "xxxx को परिभाषित करने के लिए अपेक्षित xxxx।" साथ ही, क्या यह अकेले 'ActiveSupport :: Dependencies.clear' है जो समस्या हल करती है? या क्या मूल प्रश्न में प्रत्येक_रुन उदाहरण के साथ संयोजन की आवश्यकता है? –

+0

मुझे नहीं पता क्यों, लेकिन मेरी परियोजना ने अचानक ऐसा करने शुरू कर दिया, किसी स्पष्ट कारण के लिए। मैंने निर्भरता डाली। मेरे स्पार्क.एच_रुन में स्पष्ट, और यह मेरे लिए काम किया। मेरे पास प्रत्येक_रुन में मेरा RsPEc.config नहीं है, बस: FactoryGirl.reload और ActiveSupport :: Dependencies.clear। उम्मीद है की वो मदद करदे। –

+0

ActiveSupport :: Dependencies.clear को prefork के अंत में जोड़ा जाना चाहिए, प्रत्येक_रुन – Ran

8

कोशिश ActionDispatch :: Reloader

config/environments/test.rb में config.cache_classes = false करने के साथ ही, निम्नलिखित 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 
+0

अच्छा। मुझे इसकी उम्मीद नहीं थी, लेकिन ऐसा लगता है कि यह मेरी समस्याओं को मोंगोइड और स्पार्क के साथ ठीक कर रहा था। इस विषय पर अन्य सभी दस्तावेज ([Spork.trap_method जुजित्सु] (https://github.com/sporkrb/spork/wiki/Spork.trap_method-Jujitsu) और 'ActiveSupport :: निर्भरता.क्लार') पर काम नहीं किया सब। मैं 'रेल :: Mongoid.load_models' पर अपने अतिरिक्त जाल से छुटकारा पाने में भी सक्षम था। –

+1

इस दृष्टिकोण में वास्तव में ActiveSupport :: Dependencies.clear और अधिक शामिल हैं। कॉलिंग एक्शन डिस्पैच :: Reloader.cleanup! और तैयार करो! वास्तव में क्या पुनः लोड है! रेल कंसोल में करता है। +1 –

0

हाय मैं साझा करने के लिए मुझे क्या मदद मिली चाहता था परीक्षण फिर से चल रहा है।
यह पता चला मैं shared_connection चाल को जोड़ने के लिए किया था spork के रूप में खो कनेक्शन के बारे में शिकायत की गई थी।
इस के बाद मैं ब्लॉक के अंत में पर 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?