我已经在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
(在集成测试中可以)。
答案 0 :(得分:2)
测试方法get
,post
,delete
等都假设您传递的任何参数都是其中的操作的名称控制器正在测试中所以,这个电话有效:
get :new
因为它会生成url_for(:controller => :sessions, :action => :new)
。这个电话没有:
get '/login'
因为它会生成url_for(:controller => :sessions, :action => '/login')
。
使用符号表格。
答案 1 :(得分:1)
使用网址测试此方法的正确方法是编写get login_url
而不是get login_path
。
这是因为测试过程不在浏览器中运行,因此path
变量只包含/login
,这是相对路径(当您看到时它通过浏览器,因为路径被附加)。另一方面,url
变量是一个统一资源定位器,因此它是一个绝对路径,它将起作用。