为什么在控制器测试中不可能使用路由器路径?

时间:2012-10-15 17:32:10

标签: ruby-on-rails ruby rspec routes

为什么在Rails 3中测试控制器时无法使用路由器路径?

我理解get :new会转换为{controller: 'sessions', action: 'new'},但为什么signin_path不能转换为同一个东西?例如:

# routes.rb
match 'signin', to: 'sessions#new'

# sessions_spec.rb
it "renders the 'new' template" do
  get signin_path
  response.should render_template :new
end

产地:

No route matches {:controller=>"sessions", :action=>"/signin"}

如果有方法使用路由器语法测试路由,就像在应用程序内部一样,这样会很好,例如get signin_path而不是{ get: 'http://app.com/signin/' }

2 个答案:

答案 0 :(得分:4)

我起初也很难绕过头。让我试着解释一下我是如何理解的。

我假设您的引导线看起来像这样:

describe SessionsController do

在控制器规范中,控制器类是您的主题,而不是路由系统。这就是为什么你应该在控制器中测试各个动作方法,而不是导致它们的路径。换句话说,即使您更改路由,控制器规范仍然可以正常工作。

所以你甚至不应该这样做:

it "renders the 'new' template" do
  get 'http://app.com/signin/'
  response.should render_template :new
end

你应该这样做:

it "renders the 'new' template" do
  get :new
  response.should render_template :new
end

RSpec然后以某种方式计算出你想要击中的路线。我注意到,当我搞砸时,它会给我一个路由错误。

答案 1 :(得分:2)

在routes.rb

中尝试此操作

match 'signin' => 'sessions#new', :as => :signin