15

Ho un'app in esecuzione su Rails 4/Ruby 2. Il frontend è in fase di sviluppo con Ember.Errore di dipendenza circolare in Rails 4 durante le specifiche richieste Rspec

Quando si esegue rake spec, viene visualizzata l'eccezione seguente. Sembra che accada solo nelle specifiche di Rspec (non in modalità dev). Inoltre, di solito accade solo se eseguo solo le specifiche di una caratteristica; se eseguo l'intera suite di test, di solito non ottengo l'errore.

L'errore si verifica a causa di questo si impegnano a Rails: https://github.com/rails/rails/commit/b33700f5580b4cd85379a1dc60fa341ac4d8deb2

Ma, naturalmente, non so se questo è il vero problema o se si tratta di qualcosa di più profondo nello stack di chiamate. So che se faccio un minimo cambiamento nel codice Rails per non generare quell'errore, tutto sembra funzionare bene e i miei test passano. Ma qualcosa, da qualche parte, sembra provare a caricare LocationsController anche se è già caricato.

Qualsiasi aiuto è molto apprezzato, in quanto questo mi ha davvero sconcertato.

1) Locations Creating locations 
    Failure/Error: Unable to find matching line from backtrace 
    RuntimeError: 
     Circular dependency detected while autoloading constant LocationsController 
    # /usr/local/rvm/gems/[email protected]/bundler/gems/rails-783c6711a4b4/activesupport/lib/active_support/dependencies.rb:460:in `load_missing_constant' 
    # /usr/local/rvm/gems/[email protected]/bundler/gems/rails-783c6711a4b4/activesupport/lib/active_support/dependencies.rb:183:in `const_missing' 
    # /usr/local/rvm/gems/[email protected]/bundler/gems/rails-783c6711a4b4/activesupport/lib/active_support/inflector/methods.rb:226:in `const_get' 
    # /usr/local/rvm/gems/[email protected]/bundler/gems/rails-783c6711a4b4/activesupport/lib/active_support/inflector/methods.rb:226:in `block in constantize' 
    # /usr/local/rvm/gems/[email protected]/bundler/gems/rails-783c6711a4b4/activesupport/lib/active_support/inflector/methods.rb:224:in `each' 
    # /usr/local/rvm/gems/[email protected]/bundler/gems/rails-783c6711a4b4/activesupport/lib/active_support/inflector/methods.rb:224:in `inject' 
    # /usr/local/rvm/gems/[email protected]/bundler/gems/rails-783c6711a4b4/activesupport/lib/active_support/inflector/methods.rb:224:in `constantize' 
    # /usr/local/rvm/gems/[email protected]/bundler/gems/rails-783c6711a4b4/activesupport/lib/active_support/dependencies.rb:534:in `get' 
    # /usr/local/rvm/gems/[email protected]/bundler/gems/rails-783c6711a4b4/activesupport/lib/active_support/dependencies.rb:565:in `constantize' 
    # /usr/local/rvm/gems/[email protected]/bundler/gems/rails-783c6711a4b4/actionpack/lib/action_dispatch/routing/route_set.rb:76:in `controller_reference' 
    # /usr/local/rvm/gems/[email protected]/bundler/gems/rails-783c6711a4b4/actionpack/lib/action_dispatch/routing/route_set.rb:66:in `controller' 
    # /usr/local/rvm/gems/[email protected]/bundler/gems/rails-783c6711a4b4/actionpack/lib/action_dispatch/routing/route_set.rb:44:in `call' 
    # /usr/local/rvm/gems/[email protected]/bundler/gems/rails-783c6711a4b4/actionpack/lib/action_dispatch/journey/router.rb:71:in `block in call' 
    # /usr/local/rvm/gems/[email protected]/bundler/gems/rails-783c6711a4b4/actionpack/lib/action_dispatch/journey/router.rb:59:in `each' 
    # /usr/local/rvm/gems/[email protected]/bundler/gems/rails-783c6711a4b4/actionpack/lib/action_dispatch/journey/router.rb:59:in `call' 
    # /usr/local/rvm/gems/[email protected]/bundler/gems/rails-783c6711a4b4/actionpack/lib/action_dispatch/routing/route_set.rb:655:in `call' 
    # /usr/local/rvm/gems/[email protected]/gems/request_store-1.0.5/lib/request_store/middleware.rb:9:in `call' 
    # /usr/local/rvm/gems/[email protected]/gems/warden-1.2.1/lib/warden/manager.rb:35:in `block in call' 
    # /usr/local/rvm/gems/[email protected]/gems/warden-1.2.1/lib/warden/manager.rb:34:in `catch' 
    # /usr/local/rvm/gems/[email protected]/gems/warden-1.2.1/lib/warden/manager.rb:34:in `call' 
    # /usr/local/rvm/gems/[email protected]/gems/rack-1.5.2/lib/rack/etag.rb:23:in `call' 
    # /usr/local/rvm/gems/[email protected]/gems/rack-1.5.2/lib/rack/conditionalget.rb:25:in `call' 
    # /usr/local/rvm/gems/[email protected]/gems/rack-1.5.2/lib/rack/head.rb:11:in `call' 
    # /usr/local/rvm/gems/[email protected]/bundler/gems/rails-783c6711a4b4/actionpack/lib/action_dispatch/middleware/params_parser.rb:27:in `call' 
    # /usr/local/rvm/gems/[email protected]/bundler/gems/rails-783c6711a4b4/actionpack/lib/action_dispatch/middleware/flash.rb:241:in `call' 
    # /usr/local/rvm/gems/[email protected]/gems/rack-1.5.2/lib/rack/session/abstract/id.rb:225:in `context' 
    # /usr/local/rvm/gems/[email protected]/gems/rack-1.5.2/lib/rack/session/abstract/id.rb:220:in `call' 
    # /usr/local/rvm/gems/[email protected]/bundler/gems/rails-783c6711a4b4/actionpack/lib/action_dispatch/middleware/cookies.rb:486:in `call' 
    # /usr/local/rvm/gems/[email protected]/bundler/gems/rails-783c6711a4b4/activerecord/lib/active_record/query_cache.rb:36:in `call' 
    # /usr/local/rvm/gems/[email protected]/bundler/gems/rails-783c6711a4b4/activerecord/lib/active_record/connection_adapters/abstract/connection_pool.rb:626:in `call' 
    # /usr/local/rvm/gems/[email protected]/bundler/gems/rails-783c6711a4b4/actionpack/lib/action_dispatch/middleware/callbacks.rb:29:in `block in call' 
    # /usr/local/rvm/gems/[email protected]/bundler/gems/rails-783c6711a4b4/activesupport/lib/active_support/callbacks.rb:373:in `_run__1828229838678430325__call__callbacks' 
    # /usr/local/rvm/gems/[email protected]/bundler/gems/rails-783c6711a4b4/activesupport/lib/active_support/callbacks.rb:80:in `run_callbacks' 
    # /usr/local/rvm/gems/[email protected]/bundler/gems/rails-783c6711a4b4/actionpack/lib/action_dispatch/middleware/callbacks.rb:27:in `call' 
    # /usr/local/rvm/gems/[email protected]/bundler/gems/rails-783c6711a4b4/actionpack/lib/action_dispatch/middleware/remote_ip.rb:76:in `call' 
    # /usr/local/rvm/gems/[email protected]/bundler/gems/rails-783c6711a4b4/actionpack/lib/action_dispatch/middleware/debug_exceptions.rb:17:in `call' 
    # /usr/local/rvm/gems/[email protected]/bundler/gems/rails-783c6711a4b4/actionpack/lib/action_dispatch/middleware/show_exceptions.rb:30:in `call' 
    # /usr/local/rvm/gems/[email protected]/bundler/gems/rails-783c6711a4b4/railties/lib/rails/rack/logger.rb:38:in `call_app' 
    # /usr/local/rvm/gems/[email protected]/bundler/gems/rails-783c6711a4b4/railties/lib/rails/rack/logger.rb:21:in `block in call' 
    # /usr/local/rvm/gems/[email protected]/bundler/gems/rails-783c6711a4b4/activesupport/lib/active_support/tagged_logging.rb:67:in `block in tagged' 
    # /usr/local/rvm/gems/[email protected]/bundler/gems/rails-783c6711a4b4/activesupport/lib/active_support/tagged_logging.rb:25:in `tagged' 
    # /usr/local/rvm/gems/[email protected]/bundler/gems/rails-783c6711a4b4/activesupport/lib/active_support/tagged_logging.rb:67:in `tagged' 
    # /usr/local/rvm/gems/[email protected]/bundler/gems/rails-783c6711a4b4/railties/lib/rails/rack/logger.rb:21:in `call' 
    # /usr/local/rvm/gems/[email protected]/gems/quiet_assets-1.0.2/lib/quiet_assets.rb:18:in `call_with_quiet_assets' 
    # /usr/local/rvm/gems/[email protected]/bundler/gems/rails-783c6711a4b4/actionpack/lib/action_dispatch/middleware/request_id.rb:21:in `call' 
    # /usr/local/rvm/gems/[email protected]/gems/rack-1.5.2/lib/rack/methodoverride.rb:21:in `call' 
    # /usr/local/rvm/gems/[email protected]/gems/rack-1.5.2/lib/rack/runtime.rb:17:in `call' 
    # /usr/local/rvm/gems/[email protected]/bundler/gems/rails-783c6711a4b4/activesupport/lib/active_support/cache/strategy/local_cache.rb:83:in `call' 
    # /usr/local/rvm/gems/[email protected]/bundler/gems/rails-783c6711a4b4/actionpack/lib/action_dispatch/middleware/static.rb:64:in `call' 
    # /usr/local/rvm/gems/[email protected]/bundler/gems/rails-783c6711a4b4/railties/lib/rails/engine.rb:511:in `call' 
    # /usr/local/rvm/gems/[email protected]/bundler/gems/rails-783c6711a4b4/railties/lib/rails/application.rb:97:in `call' 
    # /usr/local/rvm/gems/[email protected]/gems/rack-1.5.2/lib/rack/builder.rb:138:in `call' 
    # /usr/local/rvm/gems/[email protected]/gems/rack-1.5.2/lib/rack/urlmap.rb:65:in `block in call' 
    # /usr/local/rvm/gems/[email protected]/gems/rack-1.5.2/lib/rack/urlmap.rb:50:in `each' 
    # /usr/local/rvm/gems/[email protected]/gems/rack-1.5.2/lib/rack/urlmap.rb:50:in `call' 
    # /usr/local/rvm/gems/[email protected]/gems/capybara-2.1.0/lib/capybara/server.rb:19:in `call' 
    # /usr/local/rvm/gems/[email protected]/gems/rack-1.5.2/lib/rack/handler/webrick.rb:60:in `service' 
    # /usr/local/rvm/rubies/ruby-2.0.0-p195/lib/ruby/2.0.0/webrick/httpserver.rb:138:in `service' 
    # /usr/local/rvm/rubies/ruby-2.0.0-p195/lib/ruby/2.0.0/webrick/httpserver.rb:94:in `run' 
    # /usr/local/rvm/rubies/ruby-2.0.0-p195/lib/ruby/2.0.0/webrick/server.rb:295:in `block in start_thread' 

routes.rb:

get '/locations', to: 'main#index', :as => :em_locations 

scope 'api' do 
    resources :locations, only: [:index] 
end 

Gems rilevanti:

* capybara (2.1.0) 
    * rspec (2.13.0) 
    * rspec-core (2.13.1) 
    * rspec-expectations (2.13.0) 
    * rspec-mocks (2.13.1) 
    * rspec-rails (2.13.2) 
    * ember-data-source (0.0.5) 
    * ember-rails (0.12.0) 
    * ember-source (1.0.0.rc3.3) 
    * active_model_serializers (0.8.1) 

che cosa ho provato:

  • Cambiare i nomi ei percorsi dei miei percorsi, pensando le braciole/posizioni potrebbero essere in conflitto.
  • Modificato un numero di diverse opzioni di Rails che ho ritenuto rilevanti. In realtà, se config.cache_classes viene impostato su false nel file env test.rb, risolve il problema anche se il costo di far funzionare le specifiche circa 5 volte più lentamente.

Ecco le specifiche sto correndo:

require 'spec_helper' 

feature 'Locations', js: true, strategy: :truncation, slow: true do 

    before do 
    login_for_request 
    Factory.create(:warehouse, code: "TW", name: 'TEST WAREHOUSE') 
    end 

    scenario "Creating locations" do 
    visit em_locations_path 
    click_link "create-locations" 
    select 'TEST WAREHOUSE', from: "warehouse" 
    select "GLD", from: "section" 
    fill_in "row-start", with: "AA" 
    fill_in "row-end", with: "AB" 
    fill_in "bay-start", with: "1" 
    fill_in "bay-end", with: "2" 
    fill_in "tier-start", with: "1" 
    fill_in "tier-end", with: "2" 
    fill_in "subbay-start", with: "1" 
    fill_in "subbay-end", with: "2" 
    click_button "Create" 
    end 


end 

risposta

11

mi si avvicinò con una possibile soluzione a questo problema. Probabilmente non è il modo migliore, e non penso che dovrebbe essere necessario, ma comunque funziona e funziona in modo coerente.

Nella mia funzione specifica, mi richiedono il controller associato:

require_relative '../../app/controllers/locations_controller' 

E 'stato anche necessario richiedere l'active_model_serializer nel controller:

require_relative '../serializers/location_serializer' 

certamente benvenuto soluzioni migliori. Nel frattempo, le mie specifiche stanno passando.

+1

Grazie mille per questa domanda e risposta. Ho avuto lo stesso problema con le specifiche dei controller namespaced e questa soluzione di 'require_relative' -ing il file del controller ha funzionato per me. –

+0

Nessun problema, felice che ti abbia aiutato. – kstevens715

+0

Funziona anche per me. Mi chiedo davvero quale sia l'accordo con questo problema! –