为什么我的 rspec 测试向 javascripts/sessions.js 发送获取请求?

Why is my rspec test sending a get request to javascripts/sessions.js?

我有一个非常混乱的 Rails 应用程序,是我不久前构建的,目前正在扩展。这涉及 Ruby 版本(1.9.x 到 2.3.x)、Rails 版本(3.2.x 到 5. 0.x),以及许多其他相关的更改。它有很多问题,我不确定目前其中发生的很多事情。

为了解决我为自己造成的这个可怕的混乱局面,我决定用 RSpec 和 Capybara 编写一系列功能测试。在我需要测试使用 Javascript 的东西之前,我取得了很好的进展(最终我的大部分功能测试将测试 Javascript)。

到目前为止,我的 Rspec 测试看起来像这样(还有很多东西要完成 - 我只是卡在这里);

feature "User registers a new customer", js: true do
    scenario "Logged in user registers a new customer" do
        user = FactoryGirl.create(:user)
        visit_root_and_login user  
        fill_in 'reg_number', with: '123456'
        click_button 'Look up'
    end
end

在我的应用程序中,这会触发一个 AJAX 调用来查找注册号和 returns 一段 Javascript 根据客户是否有向表单添加其他字段之前是否注册过。

虽然发生了什么;

Failure/Error: raise ActionController::RoutingError, "No route matches [#{env['REQUEST_METHOD']}] #{env['PATH_INFO'].inspect}"

 ActionController::RoutingError:
   No route matches [GET] "/javascripts/sessions.js"
 # /Users/brad/.gem/ruby/2.3.1/gems/railties-5.0.1/lib/rails/rack/logger.rb:36:in `call_app'
 # /Users/brad/.gem/ruby/2.3.1/gems/railties-5.0.1/lib/rails/rack/logger.rb:24:in `block in call'
 # /Users/brad/.gem/ruby/2.3.1/gems/railties-5.0.1/lib/rails/rack/logger.rb:24:in `call'
 # /Users/brad/.gem/ruby/2.3.1/gems/rack-2.0.1/lib/rack/method_override.rb:22:in `call'
 # /Users/brad/.gem/ruby/2.3.1/gems/rack-2.0.1/lib/rack/runtime.rb:22:in `call'
 # /Users/brad/.gem/ruby/2.3.1/gems/rack-2.0.1/lib/rack/sendfile.rb:111:in `call'
 # /Users/brad/.gem/ruby/2.3.1/gems/railties-5.0.1/lib/rails/engine.rb:522:in `call'
 # /Users/brad/.gem/ruby/2.3.1/gems/rack-2.0.1/lib/rack/urlmap.rb:68:in `block in call'
 # /Users/brad/.gem/ruby/2.3.1/gems/rack-2.0.1/lib/rack/urlmap.rb:53:in `each'
 # /Users/brad/.gem/ruby/2.3.1/gems/rack-2.0.1/lib/rack/urlmap.rb:53:in `call'
 # /Users/brad/.gem/ruby/2.3.1/gems/capybara-2.12.1/lib/capybara/server.rb:43:in `call'
 # /Users/brad/.gem/ruby/2.3.1/gems/rack-2.0.1/lib/rack/handler/webrick.rb:86:in `service'
 # ------------------
 # --- Caused by: ---
 # NameError:
 #   uninitialized constant Selenium::WebDriver::Remote::W3CCapabilities
 #   /Users/brad/.gem/ruby/2.3.1/gems/capybara-2.12.1/lib/capybara/selenium/driver.rb:282:in `marionette?'

我尝试添加 driver: :webkit 以查看是否发生了任何不同并得到了一些稍微不同的东西;

 Failure/Error: raise ActionController::RoutingError, "No route matches [#{env['REQUEST_METHOD']}] #{env['PATH_INFO'].inspect}"

 ActionController::RoutingError:
   No route matches [GET] "/javascripts/sessions.js"
 # /Users/brad/.gem/ruby/2.3.1/gems/railties-5.0.1/lib/rails/rack/logger.rb:36:in `call_app'
 # /Users/brad/.gem/ruby/2.3.1/gems/railties-5.0.1/lib/rails/rack/logger.rb:24:in `block in call'
 # /Users/brad/.gem/ruby/2.3.1/gems/railties-5.0.1/lib/rails/rack/logger.rb:24:in `call'
 # /Users/brad/.gem/ruby/2.3.1/gems/rack-2.0.1/lib/rack/method_override.rb:22:in `call'
 # /Users/brad/.gem/ruby/2.3.1/gems/rack-2.0.1/lib/rack/runtime.rb:22:in `call'
 # /Users/brad/.gem/ruby/2.3.1/gems/rack-2.0.1/lib/rack/sendfile.rb:111:in `call'
 # /Users/brad/.gem/ruby/2.3.1/gems/railties-5.0.1/lib/rails/engine.rb:522:in `call'
 # /Users/brad/.gem/ruby/2.3.1/gems/rack-2.0.1/lib/rack/urlmap.rb:68:in `block in call'
 # /Users/brad/.gem/ruby/2.3.1/gems/rack-2.0.1/lib/rack/urlmap.rb:53:in `each'
 # /Users/brad/.gem/ruby/2.3.1/gems/rack-2.0.1/lib/rack/urlmap.rb:53:in `call'
 # /Users/brad/.gem/ruby/2.3.1/gems/capybara-2.12.1/lib/capybara/server.rb:43:in `call'
 # /Users/brad/.gem/ruby/2.3.1/gems/rack-2.0.1/lib/rack/handler/webrick.rb:86:in `service'
 # ------------------
 # --- Caused by: ---
 # Capybara::ElementNotFound:
 #   Unable to find field "reg_number"
 #   /Users/brad/.gem/ruby/2.3.1/gems/capybara-2.12.1/lib/capybara/node/finders.rb:44:in `block in find'

我不明白为什么要调用“/javascripts/sessions.js”。我没有任何此类文件,我自己也没有提出此请求。它看起来来自 Rack,但这是 Ruby 和 Rails 世界的一个区域,我真的不明白。

有没有人能够阐明这一点,所以我至少知道从哪里开始寻找?

TIA

好的,我已经解决了。

这是资产管道问题。

在我的 application.html.haml 中,我有 = javascript_include_tag "application", params[:controller] 导致在登录过程中尝试将文件 /app/assets/javascripts/sessions.js 包含在我的资产中。我没有这样的文件,所以创建了一个空白文件。然后我不得不添加

%w( sessions ).each do |controller|
  Rails.application.config.assets.precompile += ["#{controller}.js", "#{controller}.css"]
end

到我的 /app/config/initializers/assets.rb 以使其全部正常工作。

我的开发环境在服务器控制台中出现了同样的异常,但我没有注意到它并且它没有停止执行。不过在 Capybara 中,这个异常停止了整个表演。