水豚在引擎中找不到我的路线

Capybara doesn't find my route in engine

我为自己启动了一个新的 Rails 5 个应用程序,以了解如何使用引擎和简单的测试目的对应用程序进行模块化。 我决定使用 Rspec 和 Capybara 进行集成测试。

我有一个非常基本的功能rspec:

okinsmen/components/okm_backend/spec/features/humen_spec.rb

require 'rails_helper'

feature "Humen process" do
  scenario "go to index page" do
    visit '/humen'
    expect(page).to have_content("List of humen")
  end
end

这是我的路线:

okinsmen/components/okm_backend/config/routes.rb

    OkmBackend::Engine.routes.draw do
      root 'dashboards#index'
      resource :dashboards, only: [:index]
      resources :humen
    end

以及终端中命令railsapp:routes的结果:

Prefix Verb URI Pattern  Controller#Action
okm_backend      /okm_backend OkmBackend::Engine

Routes for OkmBackend::Engine:
      root GET    /                         okm_backend/dashboards#index
     humen GET    /humen(.:format)          okm_backend/humen#index
           POST   /humen(.:format)          okm_backend/humen#create  new_human GET    /humen/new(.:format)      okm_backend/humen#new edit_human GET    /humen/:id/edit(.:format) okm_backend/humen#edit
     human GET    /humen/:id(.:format)      okm_backend/humen#show
           PATCH  /humen/:id(.:format)      okm_backend/humen#update
           PUT    /humen/:id(.:format)      okm_backend/humen#update
           DELETE /humen/:id(.:format)      okm_backend/humen#destroy

一切看起来都不错,但我总是得到这个错误:

1) Humen process go to index page
     Failure/Error: visit '/humen'

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

如果我用 humen_path 替换访问“/humen”,我会得到这个错误:

  1) Humen process go to index page
     Failure/Error: visit humen_path

     NameError:
       undefined local variable or method `humen_path' for #<RSpec::ExampleGroups::HumenProcess:0x00000006843ea0>

要解决最后一个问题,我必须在 rails_helper.spec:

中添加这一行
config.include OkmBackend::Engine.routes.url_helpers

现在测试通过了。

但我无法使用字符串进行测试 URL。

申请可以看看https://github.com/patdec/okinsmen/tree/engines

这是非常基础的。 如果你能帮助我,谢谢。

更新:

如果我这样写规范(正如 Tom Walpole 所回答的):

scenario "go to index page" do
    visit '/okm_backend/humen'
    expect(page).to have_content("Humen list")
  end

有效

但这不是:

scenario "display new page" do
    click_on '/okm_backend/humen/new'
    expect(page).to have_content("New human")
  end

您是否尝试过在 rails 控制台中执行 app.humen_path?您必须将该字符串用作 URL.

在您的 spec/dummy/config/routes.rb 中,您将引擎安装在 /okm_backend 用于测试目的

Rails.application.routes.draw do
  mount OkmBackend::Engine => "/okm_backend"
end

这意味着用字符串调用 visit 需要

visit '/okm_backend/humen'

更好的解决方案是使用 engine_name.some_path,在您的情况下是:

okm_backend.humen_path
# returns /okm_backend/humen