使用_path会导致“没有匹配路由”的错误。

3

我正在跟着 Rails 的教程学习,现在需要为几个页面添加一些测试。

我试图在 pages_controller_test 中使用 help_path 而不是 :help:

test "should get help" do
  get help_path
  assert_response :success
  assert_select "title", "Help | #{@base_title}"
end

我在我的routes.rb文件中添加了这行代码:
 get  '/help',    to: 'pages#help'

我得到了这个错误:
1)错误: PagesControllerTest # test_should_get_help: ActionController :: UrlGenerationError:没有匹配路由{:action =>“/help”,:controller =>“pages”} test / controllers / pages_controller_test.rb:62:在`block in'

我尝试了一些解决方案,但都没有解决我的问题。 我还尝试使用以下代码行:
match '/home' => 'main_pages#home', :as => :home

但它仍然没有起作用。
我的Rails版本是:4.2.4 我的Ruby版本是:ruby 2.1.9p490(2016-03-30 revision 54437)[x86_64-linux-gnu] $rake routes的输出:
 Prefix Verb URI Pattern          Controller#Action
 root GET  /                    pages#home
 help GET  /help(.:format)      pages#help
 courses GET  /courses(.:format)   pages#courses
 programs GET  /programs(.:format)  pages#programs
 schools GET  /schools(.:format)   pages#schools
 dashboard GET  /dashboard(.:format) pages#dashboard
 profile GET  /profile(.:format)   pages#profile
 account GET  /account(.:format)   pages#account
 signout GET  /signout(.:format)   pages#signout

编辑: 我可以在我的HTML代码中使用 help_path 等,但是在测试中它会出现错误。 谢谢 :)


@mmichael 我尝试使用“help”代替,但我仍然得到相同的错误。 - Ouissal
get '/help', to: 'pages#help', as: :help ... 这真的不起作用吗? - max pleaner
你的测试中get '/help'怎么样? - Sebastián Palma
从路由名称中删除斜杠 - max pleaner
@maxpleaner 我已经将它移除了,但仍然出现相同的错误,可能与我的 Rails 版本有关? - Ouissal
显示剩余10条评论
1个回答

1

我已经使用repo、Rails 4.2.4和Minitest 5.10.2运行了你的测试,唯一没有通过的测试是使用get help_path的那个。为了缩短帖子,我只放了这3个测试:

PagesControllerTest#test_should_get_help_using_"get_:help" = 0.39 s = .
PagesControllerTest#test_should_get_help_using_"get_help_path" = 0.00 s = E
PagesControllerTest#test_should_get_help_using_"get_'help'" = 0.01 s = .

Finished in 0.405330s, 7.4014 runs/s, 9.8685 assertions/s.

  1) Error:
PagesControllerTest#test_should_get_help_using_"get_help_path":
ActionController::UrlGenerationError: No route matches {:action=>"/help", :controller=>"pages"}
    test/controllers/pages_controller_test.rb:70:in `block in <class:PagesControllerTest>'

3 runs, 4 assertions, 0 failures, 1 errors, 0 skips

我做了什么:
$ rm -rf Gemfile.lock (because of a json -v 1.8.1 gem error)
$ bundle
$ rake db:migrate
$ rake db:migrate RAILS_ENV=test
$ rake test test/controllers/pages_controller_test.rb -v

您可以使用以下方法使测试与help_path作为路由来测试指定的控制器和操作:

assert_routing断言给定路径的路由处理正确,并且匹配预期选项哈希中给定的解析选项。基本上,它断言Rails能够识别给定的路由。

或者:

assert_recognizes断言路径和选项在双向匹配;换句话说,它验证路径生成选项,然后验证选项生成路径。这实际上将assert_recognizes和assert_generates合并成了一个步骤。

例如:

test "should get help using assert_recognizes and help_path" do
  assert_recognizes({controller: 'pages', action: 'help'}, help_path)
  assert_response :success
end

test "should get help using assert_routing and help_path" do
  assert_routing help_path, controller: 'pages', action: 'help'
  assert_response :success
end

非常感谢! - Ouissal
感谢您的研究。请注意,引号中的 assert_routing 和 assert_recognized 是颠倒的。 - h0ly

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