15

我有一個應用程序在Rails 4/Ruby 2上運行。前端正在使用Ember開發。Rspec請求規範中的Rails 4中的循環依賴錯誤

當運行rake spec時,我得到以下例外。它似乎只發生在Rspec功能規格(不在開發模式)。另外,它通常只在我運行一個功能規格時纔會發生;如果我運行整個測試套件,通常不會發生錯誤。

錯誤是因爲這個承諾Rails的出現: https://github.com/rails/rails/commit/b33700f5580b4cd85379a1dc60fa341ac4d8deb2

但是,當然,我不知道這是否是真正的問題,如果這件事情在調用堆棧更深。我知道,如果我在Rails代碼中做一個微小的更改而不拋出這個錯誤,那麼一切似乎都可以正常工作,並且我的測試通過了。但某些地方似乎試圖加載LocationsController,即使它已經加載。

任何幫助非常感謝,因爲這一個讓我真的難住。

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 

相關寶石:

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

我已經試過:

  • 改變我的路線的名稱和路徑,思考燼/地點可能會相互衝突。
  • 更改了一些我認爲可能相關的不同Rails選項。實際上,如果我在test.rb env文件中將config.cache_classes設置爲false,它將解決此問題,儘管以使規格運行速度降低5倍爲代價。

這裏是我運行規範:

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 

回答

11

,我想出了一個可能的解決這個問題。這可能不是最好的方式,我不認爲這是必要的,但它仍然可以工作並始終如一地工作。

在我的功能規格,我需要相關的控制器:

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

也有必要要求在控制器中active_model_serializer:

require_relative '../serializers/location_serializer' 

我當然歡迎更好的解決方案。與此同時,我的規格正在消失。

+1

非常感謝您的回答。我對命名空間控制器規範有同樣的問題,並且'require_relative'這個解決方案的控制器文件爲我工作。 –

+0

沒問題,很高興幫助你。 – kstevens715

+0

也適用於我。我真的很想知道這個問題到底是怎麼回事! –