Rails 5.1 RSpec 3.6
我有一个控制器:
class SessionController < ApplicationController
def new
end
end
自定义路线:
get 'login' => 'sessions#new'
RSpec测试:
require 'rails_helper'
RSpec.describe SessionController, type: :controller do
describe "GET #new" do
before do
routes.draw { get "login" => "sessions#new" }
end
it "returns http success" do
get :login
expect(response).to have_http_status(:success)
end
end
end
并收到错误:
ActionController::UrlGenerationError: No route matches {:action=>"login", :controller=>"session"}
所以&#34;得到&#34;在控制器测试中,似乎总是映射到动作而不是路径。我该怎么做才能进行这个测试?提前谢谢。
答案 0 :(得分:1)
ActionController :: UrlGenerationError:没有路由匹配 {:action =&gt;&#34;登录&#34;,:controller =&gt;&#34;会话&#34;}
您的控制器名称为SessionController
,因此您的路线应为
get 'login' => 'session#new'
不是get 'login' => 'sessions#new'
require 'rails_helper'
RSpec.describe SessionController, type: :controller do
describe "GET #new" do
before do
routes.draw { get "login" => "session#new" }
end
it "returns http success" do
get :login
expect(response).to have_http_status(:success)
end
end
end
也可以在routes.rb
中更改它。
答案 1 :(得分:0)
当您编写测试并使用方法get,post,delete等时,这些方法假定您传递的任何参数都是被测试控制器中的操作的名称。所以,这有效:
get :new
因为它生成url_for(:controller =&gt;:sessions,:action =&gt;:new)。
这不起作用:
get '/login'
因为它会生成url_for(:controller => :sessions, :action => '/login')
。