我的AdminController看起来像:
class AdminController < ApplicationController
before_action :check_admin
private
def check_admin
redirect_to 'home/error' unless current_user.admin?
end
end
在我的rspec测试中,如果没有路径或视图,我该如何测试呢?
需要'rails_helper'
RSpec.describe AdminController, type: :controller do
context "with no render_views" do
it "redirects for non-admin users" do
#???expect do
end
end
end
答案 0 :(得分:1)
我假设您在中使用
before_action
,即使此控制器没有任何操作,因此任何从其继承的控制器都将自动由&#34; admin仅&#34;
如果是这样,有两种方法可以对此进行测试。
1)不要为AdminController
编写测试。
相反,为稍后定义的任何控制器操作编写测试!例如,如果您明天在应用程序中有以下控制器:
check_admin
然后你可以为该控制器编写以下规范。
UsersController < AdminController
def index
@users = User.all
end
end
等等!
2)直接调用私有方法
这种方法让我觉得有点icky。虽然这违背了公共方法和私有方法的理念,但可以使用describe UsersController
it 'redirects for non-admins' do
# insert the test you feel like writing here!
end
it 'renders the right template for admin users' do
magical_login_method
get :index
expect(response).to render_template(:index)
end
end
方法在ruby中调用私有方法。
.send
有些人(可能很多人)认为这种测试非常具有侵入性,甚至可能会限制您的代码库在未来的灵活性。我推荐方法1,不是因为它很懒,而是因为它测试了一些东西需要测试的东西!