Rails4 - 测试 - URLGenerationError:没有路由匹配

时间:2016-10-27 17:31:28

标签: ruby-on-rails ruby-on-rails-4 testing routes

我已经在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(在集成测试中可以)。

2 个答案:

答案 0 :(得分:2)

测试方法getpostdelete等都假设您传递的任何参数都是其中的操作的名称控制器正在测试中所以,这个电话有效:

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变量是一个统一资源定位器,因此它是一个绝对路径,它将起作用。