Rails Spec Controller Test使用自定义路由失败

时间:2017-05-13 07:26:53

标签: ruby-on-rails rspec

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;在控制器测试中,似乎总是映射到动作而不是路径。我该怎么做才能进行这个测试?提前谢谢。

2 个答案:

答案 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')