RSpec - Capybara 和 Puma - 路由错误

3

我正在尝试使用Capybara作为前端测试套件(Vue),但是Puma出现了以下错误:

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

     ActionController::RoutingError:
       No route matches [GET] "/login"

这是什么原因,如何解决?这与配置有关吗?如果需要,让我知道是否应在我的问题中包含更多代码。
rails_helper.rb:
ENV['RAILS_ENV'] ||= 'test'

require File.expand_path('../../config/environment', __FILE__)

abort("The Rails environment is running in production mode!") if Rails.env.production?

require 'spec_helper'
require 'rspec/rails'
require "pundit/rspec"
require "capybara/rails"
require "capybara/rspec"
require "capybara/poltergeist"
require 'database_cleaner'
require 'factory_girl'
require 'shoulda/matchers'
require "paperclip/matchers"
require 'support/spec_helpers/warden_controller_helpers'
require 'webmock/rspec'
require 'support/spec_helpers/webmock_helper'


Capybara.javascript_driver = :poltergeist

login_spec.rb:

require 'rails_helper'

RSpec.feature "User login", type: :feature, js: true do

  before :each do
      @user = User.create!(
        first_name: "Bob",
        last_name: "Brown",
        email: "bob@email.com",
        password: "bob1",
        has_accepted_terms: true
      )
    end

  scenario "User logs in with correct credentials" do
    visit root_path
    save_screenshot
    click_on 'Log In'
    sleep 1
    save_screenshot

  end

end

如果您遇到相同的錯誤,請在非無頭模式下運行,暫停測試並嘗試自己進行交互操作(檢查開發人員控制台是否有錯誤等) - 您收到ActionController :: RoutingError意味著vue路由器沒有做您想要的事情(或者可能根本沒有加載)。至於那個教程,它已經過期了,而使用Poltergeist上的“trigger”是一個可怕的建議,而不充分解釋這樣做的代價(測試不再像用戶可以做的那樣,那麼甚至有這些測試的意義是什麼)。 - Thomas Walpole
如果浏览器的开发控制台中没有显示JS错误,请检查网络选项卡以确保它正在加载您认为应该加载的所有内容(特别是路由器)。 - Thomas Walpole
@jj008 它将被加载到您的 JS 文件之一中,我无法知道哪一个,因为这完全取决于您如何包含所有资产。 顺便说一句 - 您没有同时使用 turbolinks 和 vue 吧? - Thomas Walpole
@jj008 有可能 turbolinks 正在接管链接并向应用程序发出请求 - 您可以尝试在“登录”链接/按钮上禁用 turbolinks,以查看是否存在此问题 - 请参阅 turbolinks 文档以了解如何操作。 - Thomas Walpole
@ThomasWalpole 我在指向 '/login' 的 <a> 标签中添加了 data-turbolinks="false",但是 Puma 仍然报错 :( - jj008
显示剩余12条评论
1个回答

3
因此,如果我运行开发服务器并访问 'localhost:3000' (这基本上是你要告诉 Capybara 做的事情),那么页面上会有一个指向app.localhost:3000/login 的损坏的“登录”链接,而该应用程序无法处理该链接。 这是因为访问没有 app 子域的URL使用 application.html.haml 布局,该布局不包含JS(因此也没有Vue路由器来处理 /login 路径)。但是,如果我在浏览器中访问 app.localhost:3000 ,那么会出现一个带有工作的 Log In 链接的页面,因为该页面加载了所有JS(包括Vue路由器),因为它使用的是 app.html.haml (BaseController)布局。
你需要修复主页链接以正确运行和/或配置 Capybara 默认连接到 app 子域。
Capybara.app_host = 'http://app.localhost' # hostname with ‘app’ sub domain that resolves to interface the AUT is being run on
Capybara.always_include_port = true 

基本上,Capybara告诉您应用程序的主页已经损坏,因为它确实损坏了。

我知道访问主页时需要子域名app,但现在我尝试渲染的每个页面URL中都有额外的app(例如:app.app.localhost:62281/login),这导致我的ajax调用出现问题。是否可能让Capybara仅在主页上添加app - jj008
@jj008 如果应用程序在Capybara请求时在页面上创建类似的URL,则对于普通用户也会这样做,这真的听起来像您需要找出路由和URL生成并加以修复。不过,回答您的问题,如果您删除上面的Capybara.app_host设置,如果需要,您始终可以调用 visit('http://app.localhost/') 而不是 visit root_path,但我猜测您以后仍然会遇到URL问题,因为您当前的URL创建逻辑似乎有问题。也许检查测试环境中的 config.action_dispatch.tld_length 是否正确。 - Thomas Walpole

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接