水豚在引擎中找不到我的路线
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
我为自己启动了一个新的 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