Тест Capybara: js => true... Ошибка маршрутизации: нет совпадений маршрута [GET] "/assets"

Я получаю подобную ошибку в ряде тестов, когда добавляю к ним ": js = > true". например:

    An error occurred in an after hook
      ActionController::RoutingError: No route matches [GET] "/assets"
      occurred at /Users/appletart/.rvm/gems/[email protected]/gems/actionpack-3.2.5/lib/action_dispatch/middleware/debug_exceptions.rb:21:in `call'

Я раньше не тестировал материалы с поддержкой JavaScript в своем приложении и только что решил сделать это, обновив Capybara 2 и установив средство очистки баз данных. config.use_transactional_fixtures = false, и я добавил некоторые до/после перехвата (hooks?) в мой файл spec_helper, который я скопировал непосредственно из принятого ответа здесь.

Я запускаю:

  • Rails 3.2.5
  • Rspec-rails 2.12.2.

Может кто-нибудь подскажет мне, как я могу атаковать этот? Большое спасибо!

    4) Event pages 'CREATE' submitting a valid form provides a success notification and displays new event page 
    Failure/Error: Unable to find matching line from backtrace
    ActionController::RoutingError:
    No route matches [GET] "/assets"
    # /Users/appletart/.rvm/gems/[email protected]/gems/actionpack-3.2.5/lib/action_dispatch/middleware/debug_exceptions.rb:21:in `call'
    # /Users/appletart/.rvm/gems/[email protected]/gems/actionpack-3.2.5/lib/action_dispatch/middleware/show_exceptions.rb:56:in `call'
    # /Users/appletart/.rvm/gems/[email protected]/gems/railties-3.2.5/lib/rails/rack/logger.rb:26:in `call_app'
    # /Users/appletart/.rvm/gems/[email protected]/gems/railties-3.2.5/lib/rails/rack/logger.rb:16:in `call'
    # /Users/appletart/.rvm/gems/[email protected]/gems/actionpack-3.2.5/lib/action_dispatch/middleware/request_id.rb:22:in `call'
    # /Users/appletart/.rvm/gems/[email protected]/gems/rack-1.4.1/lib/rack/methodoverride.rb:21:in `call'
    # /Users/appletart/.rvm/gems/[email protected]/gems/rack-1.4.1/lib/rack/runtime.rb:17:in `call'
    # /Users/appletart/.rvm/gems/[email protected]/gems/activesupport-3.2.5/lib/active_support/cache/strategy/local_cache.rb:72:in `call'
    # /Users/appletart/.rvm/gems/[email protected]/gems/rack-1.4.1/lib/rack/lock.rb:15:in `call'
    # /Users/appletart/.rvm/gems/[email protected]/gems/actionpack-3.2.5/lib/action_dispatch/middleware/static.rb:62:in `call'
    # /Users/appletart/.rvm/gems/[email protected]/gems/railties-3.2.5/lib/rails/engine.rb:479:in `call'
    # /Users/appletart/.rvm/gems/[email protected]/gems/railties-3.2.5/lib/rails/application.rb:220:in `call'
    # /Users/appletart/.rvm/gems/[email protected]/gems/rack-1.4.1/lib/rack/builder.rb:134:in `call'
    # /Users/appletart/.rvm/gems/[email protected]/gems/rack-1.4.1/lib/rack/urlmap.rb:64:in `block in call'
    # /Users/appletart/.rvm/gems/[email protected]/gems/rack-1.4.1/lib/rack/urlmap.rb:49:in `each'
    # /Users/appletart/.rvm/gems/ru[email protected]/gems/rack-1.4.1/lib/rack/urlmap.rb:49:in `call'
    # /Users/appletart/.rvm/gems/[email protected]/bundler/gems/capybara-8368069cfd05/lib/capybara/server.rb:19:in `call'
    # /Users/appletart/.rvm/gems/[email protected]/gems/rack-1.4.1/lib/rack/handler/webrick.rb:59:in `service'
    # /Users/appletart/.rvm/rubies/ruby-1.9.3-p0/lib/ruby/1.9.1/webrick/httpserver.rb:138:in `service'
    # /Users/appletart/.rvm/rubies/ruby-1.9.3-p0/lib/ruby/1.9.1/webrick/httpserver.rb:94:in `run'
    # /Users/appletart/.rvm/rubies/ruby-1.9.3-p0/lib/ruby/1.9.1/webrick/server.rb:191:in `block in start_thread'

Ответ 1

Ваш пропущенный маршрут выглядит как путь автогенерации активов с нулевым входом. Вы уверены, что ваши активы правильно указаны в вашем css/sass или везде, откуда этот маршрут?

Я боролся с аналогичной проблемой, когда путь к ресурсу вызывал ошибку маршрутизации

  1) user signup: [ JS ] : creates User on successful signup
     Failure/Error: Unable to find matching line from backtrace
     ActionController::RoutingError:
       No route matches [GET] "/assets/images/leftArrow.png"

а затем трассировка стека, практически идентичная вашей. В моем случае оказалось, что актив фактически отсутствовал (что осталось незамеченным в моей версии .log и в моей тестовой среде до недавнего времени я безрассудно "скомпилировал" проект через несколько месяцев бездействия)

По пути я много узнал о Capybara app_host и обработке активов, активы, предварительно скомпилированные в разных средах, Application.configure.assets. [debug | digest |...] и так, вероятно, где вы должны искать в первое место. Или в sprckets/sass-rails url helper... ведь ваш пропущенный маршрут по-прежнему выглядит как автогенерируемый путь к ресурсам с пустым входом)

Если вышеописанное не помогает обходному пути, возможно, добавляется следующая строка в средах /test.rb:

config.action_dispatch.show_exceptions = true

Не обращаясь к проблеме напрямую, она успешно подавила ее в моем случае.

Другой способ обхода может быть в spec_helper.rb:

 ActionController::Base.asset_host = "http://myapp.dev"

где myapp.dev - это работающий экземпляр myApp в режиме разработки, который поставляет активы или, по крайней мере, не попадает в вашу тестовую маршрутизацию для активов, но, вероятно, нужно делать это только в полном разоблачении. Это было основано на стратегии избегать компиляции активов, как объяснено в http://johnbintz.github.com/blog/2012/01/07/cucumber-capybara-asset-pipeline-debug-mode/

Также потенциально полезно: http://guides.rubyonrails.org/asset_pipeline.html http://rubydoc.info/github/jnicklas/capybara/master/Capybara#configure-class_method

Ответ 2

В моем случае добавление:

config.assets.debug = true

to config/environments/test.rb исправлено.

В документации говорится:

Вам не нужно менять test.rb. По умолчанию в тестовой среде: config.assets.compile - true, а config.assets.compress, config.assets.debug и config.assets.digest - false.

Но, по крайней мере, в моем случае, мне нужно было изменить его... Если бы кто-нибудь мог точно объяснить, почему он работает, я был бы рад...

Ответ 3

В моем случае я получаю

 Failure/Error: Unable to find matching line from backtrace
 ActionController::RoutingError:
   No route matches [GET] "/favicon.ico"

Я уже поместил пустой файл favicon.ico в app/assets/images, поэтому сервер разработки в порядке. Но тестовая среда не знает, как обрабатывать активы в этом случае. Обходной путь, который я нашел, заключался в том, чтобы включить статическую службу (вместо использования другого сервера для обслуживания статических активов). Конечно, наказание - это производительность.

  in environments/test.rb, set
  config.serve_static_assets = true # default is false