如何在没有操作的情况下测试AdminController?

时间:2016-01-20 02:42:35

标签: ruby-on-rails rspec

我的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

1 个答案:

答案 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,不是因为它很懒,而是因为它测试了一些东西需要测试的东西!