15

Mam aplikację uruchomioną na Railsach 4/Ruby 2. Frontend jest rozwijany z Ember.Błąd zależności okrężnej w Railsach 4 podczas Rspec Request Specs

Po uruchomieniu rake spec otrzymuję poniższy wyjątek. Wydaje się, że dzieje się to tylko w specyfikacjach funkcji Rspec (nie w trybie deweloperskim). Zwykle dzieje się tak tylko wtedy, gdy uruchomię tylko jedną specyfikację funkcji; jeśli uruchomię cały zestaw testów, zwykle nie otrzymam błędu.

Błąd występuje z tego powodu popełnić do Rails: https://github.com/rails/rails/commit/b33700f5580b4cd85379a1dc60fa341ac4d8deb2

Ale, oczywiście, nie wiem, czy to jest prawdziwy problem, lub jeśli jest to coś głębiej w stosie wywołań. Wiem, jeśli dokonam minimalnej zmiany w kodzie Rails, aby nie wyrzucić tego błędu, wszystko wydaje się działać dobrze i moje testy mijają. Ale coś, gdzieś, wydaje się próbować załadować LocationsController, mimo że jest już załadowany.

Każda pomoc jest bardzo doceniana, ponieważ ta osoba naprawdę mnie zaskoczyła.

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/ruby-2.[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 

Istotne Gems:

* 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) 

Co próbowałem:

  • Zmiana nazwy i ścieżki moimi drogami, myślenia ember/lokalizacje mogą być w konflikcie.
  • Zmieniono wiele różnych opcji Railsów, które uważałem za istotne. Właściwie, jeśli ustawię config.cache_classes na false w pliku env test.rb, to rozwiązuje problem, chociaż kosztem spowolnienia pracy specyfikacji o 5X.

Oto spec biegnę:

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 

Odpowiedz

11

wymyśliłem Jednym z możliwych rozwiązań tego problemu. Prawdopodobnie nie jest to najlepszy sposób i nie uważam, że powinien on być konieczny, ale mimo to działa i działa konsekwentnie.

W mojej funkcji specyfikacji, I wymagają powiązanych Kontroler:

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

Konieczne było również wprowadzenie wymogu active_model_serializer w kontrolerze:

require_relative '../serializers/location_serializer' 

pewno witamy lepszych rozwiązań. W międzyczasie moje dane techniczne przemijają.

+1

Dziękuję bardzo za to pytanie i odpowiedź. Miałem ten sam problem ze specyfikacją kontrolera nazw z kontrolerem i tym rozwiązaniem 'require_relative'-ing pliku kontrolera w moim przypadku. –

+0

Nie ma problemu, cieszę się, że ci pomogło. – kstevens715

+0

Działa również dla mnie. Naprawdę zastanawiam się, jaka jest umowa z tym problemem! –

Powiązane problemy