【发布时间】:2025-12-12 13:30:03
【问题描述】:
我在 SO 中阅读了很多其他问题,但没有一个可以解决我的问题(它们似乎都与参数有关)。我希望有人可以帮助我。
执行我的控制器测试我收到这条消息:
ActionController::UrlGenerationError: No route matches
{:action=>"/login", :controller=>"sessions"}
test/controllers/sessions_controller_test.rb:6:in `block in
<class:SessionsControllerTest>'
我的rake routes 看起来像这样:
Prefix Verb URI Pattern Controller#Action
login GET /login(.:format) sessions#new
POST /login(.:format) sessions#create
logout DELETE /logout(.:format) sessions#destroy
我的测试本身就是这个:
test "should get new" do
puts 'debug: ' + login_path
get login_path
assert_response :success
end
puts 调试行打印:debug: /login
当我在网络浏览器中转到localhost:3000/login 时,它会正确加载页面并调试它使用的信息:
controller: sessions
action: new
知道为什么测试没有正确重定向到new 操作,而是寻找不存在的操作/login?谢谢!
编辑:解决方案
按照下面的答案,我找到了解释整个问题的链接:
http://blog.bigbinary.com/2016/04/19/changes-to-test-controllers-in-rails-5.html
在 Rails4(我正在使用)上,控制器测试使用 ActionController::TestCase,其中必须使用 get :new 而不是 get login_url(这在集成测试中是可以的)。
【问题讨论】:
-
你为什么用
get login_path而不是get :new? -
跟随railstutorial.org/book/basic_login 尝试了您的代码并且工作正常。谢谢!
-
我想知道它是否应该适用于教程风格。
-
不应该。那本书现在已经过时了;如果您使用的 Rails 版本比本书更新,则无法保证其中的 任何内容 都能正常工作。
标签: ruby-on-rails ruby-on-rails-4 testing routes