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