15

Tôi có một ứng dụng đang chạy trên Rails 4/Ruby 2. Giao diện đang được phát triển với Ember.Lỗi phụ thuộc tròn trong Rails 4 trong Thông số Yêu cầu Rspec

Khi chạy rake spec, tôi nhận được ngoại lệ bên dưới. Dường như chỉ xảy ra trong các đặc điểm kỹ thuật của Rspec (không phải ở chế độ dev). Ngoài ra, nó thường chỉ xảy ra nếu tôi chạy chỉ một tính năng spec; nếu tôi chạy toàn bộ bộ thử nghiệm, tôi thường không gặp lỗi.

Các lỗi xảy ra vì điều này cam kết Rails: https://github.com/rails/rails/commit/b33700f5580b4cd85379a1dc60fa341ac4d8deb2

Nhưng, tất nhiên, tôi không biết nếu đó là vấn đề thực sự hoặc nếu nó là cái gì sâu sắc hơn trong các cuộc gọi stack. Tôi biết, nếu tôi thực hiện một thay đổi tối thiểu trong mã Rails để không ném lỗi đó, mọi thứ dường như hoạt động tốt và các bài kiểm tra của tôi vượt qua. Nhưng một cái gì đó, một nơi nào đó, dường như đang cố gắng tải LocationsController mặc dù nó đã được tải.

Bất kỳ trợ giúp nào được đánh giá cao, vì điều này khiến tôi thực sự bối rối.

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 liên quan:

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

Những gì tôi đã cố gắng:

  • Thay đổi tên và đường dẫn của các tuyến đường của tôi, suy nghĩ ember/địa điểm có thể xung đột.
  • Đã thay đổi một số tùy chọn Rails khác nhau mà tôi nghĩ có thể có liên quan. Trên thực tế, nếu tôi đặt config.cache_classes thành false trong tệp testvr env, nó giải quyết được vấn đề mặc dù chi phí làm cho các thông số kỹ thuật chạy chậm hơn khoảng 5 lần.

Dưới đây là spec Tôi đang chạy:

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 

Trả lời

11

tôi đã đưa ra một giải pháp khả thi cho vấn đề này. Nó có lẽ không phải là cách tốt nhất, và tôi không nghĩ rằng nó cần thiết, nhưng dù sao nó hoạt động và hoạt động liên tục.

Trong tính năng của tôi spec, tôi yêu cầu bộ điều khiển đi kèm:

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

Nó cũng là cần thiết để yêu cầu active_model_serializer trong bộ điều khiển:

require_relative '../serializers/location_serializer' 

Tôi chắc chắn đón giải pháp tốt hơn. Trong khi đó, thông số kỹ thuật của tôi đang trôi qua.

+1

Cảm ơn bạn rất nhiều vì câu hỏi và câu trả lời này. Tôi đã có cùng một vấn đề với thông số kỹ thuật điều khiển không gian tên và giải pháp này 'require_relative'-ing tập tin điều khiển trong làm việc cho tôi. –

+0

Không có vấn đề, vui mừng nó đã giúp bạn. – kstevens715

+0

Làm việc cho tôi. Tôi thực sự tự hỏi thỏa thuận này là gì với vấn đề này! –