2

为什么在 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/' }

4

2 回答 2

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 会以某种方式确定您要尝试的路线。我注意到,当我搞砸某些东西时,它会给我一个路由错误。

于 2012-10-15T18:46:17.883 回答
2

在你的 routes.rb 中试试这个

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

于 2012-10-15T17:56:38.813 回答