[英]how to test all routes in controller with rspec
我试图限制我的应用程序中的一些控制器在任何操作之前都需要登录。 我知道如何实现它,但不知道如何在 rspec 中为它编写好的测试。
例如,如果我想限制我的用户控制器的每个操作都需要登录,我可以进行如下测试:
描述“授权”做
describe "for non-signed-in users" do
let(:user) { FactoryGirl.create(:user) }
describe "in the Users controller" do
describe "visiting the index page" do
before { visit users_path }
it { should have_selector('title', text: 'Log In') }
end
describe "visiting the edit page" do
before { visit edit_user_path(user) }
it { should have_selector('title', text: 'Log In') }
end
describe "submitting to the update action" do
before { put user_path(user) }
specify { response.should redirect_to(login_path) }
end
describe "submitting a DELETE request to the Users#destroy action" do
before { delete user_path(user) }
specify { response.should redirect_to(root_path) }
end
....etc.....
end
end
我是否需要为我要测试的每个控制器指定所有 7 个静态路由? 看起来效率很低。 有没有办法说“在访问任何用户路由响应之前应该重定向到 login_path”?
我在尝试列出然后测试我所有应用程序路由的 500 个错误时也有类似的担忧,而且我不想手动逐个添加每个路由(我有 150 个左右)。
我在命令rake routes
镜像了代码,并使用ActionDispatch::Routing::RouteWrapper
以及Rails.application.routes.routes
列出它们。
包装器提供了一种简单的方法来检查路由的控制器、动词和动作是什么。 从那里,您只需要过滤要检查的路由,并在对每个路由进行测试时对其进行迭代。
context 'all routes' do
let(:all_app_routes) do
Rails.application.routes.routes.collect do |route|
ActionDispatch::Routing::RouteWrapper.new route
end.reject(&:internal?)
end
context 'in the Users controller' do
let(:users_controller_routes) do
all_app_routes.select { |route| route.controller == 'users' }
end
it 'all routes should redirect to login' do
users_controller_routes.each do |route|
begin
# reconstruct the path with the route name
# I did not test the line below, I personnaly kept using get('/' << route.name) as my case was to test the index pages only.
# but you get the idea: call your http route below (http.rb, net/http, ...)
send(route.verb, '/' << route.name)
# will produce something like : get('/users/')
# test it does indeed redirect
expect(response.status).to eq(302)
expect(response.body).to include?('my_redirect_location')
# you could also continue further testing
follow_redirect!
expect(response.body).to include('<div id="login">')
rescue Exception
next
# or fail test depending on what you want to check
# I had the case of abstract method in controllers that raised exception
end
end
end
end
end
我个人仅使用此代码来测试索引方法( select {|route| route.action =='index' }...
),因为批量测试 create/destroy/new/edit 被证明太困难了(不同需要的参数每个时间)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.