2012-10-15 44 views
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/' }

+0

语法应该是'match'/ signin',以''sessions#new''(你没有领先的'/')。 – cdesrosiers

+0

@cdesrosiers:不正确。但是,公平地说,你建议的代码工作也是。 –

回答

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然后以某种方式计算出你想打哪条路线。我注意到当我弄东西时,它给我一个路由错误。

+0

请注意,如果您想运行涉及路由'* _path'助手的测试,则可以执行“集成”(aka“request”)规范。它们与控制器规格不同。 –

+0

这很有道理。公平地说,我已经在测试这些线。让我感到沮丧的是子域限制路线。例如,我想确保在不使用子域时,通过子域的'signup_path'有不同的结果。使用'get:whatever'可以绕过路由器,所以期望值会改变。我最终将这些测试移到了请求规格中。 – Mohamad

+0

@Mohamad:我想,但我想在答案中清楚。看看这种方法来更改控制器规格中的域:http://stackoverflow.com/questions/2556627/rails-rspec-set-subdomain –

2

试试这个在你的routes.rb

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

相关问题