0

プロジェクトの管理セクションの基本コントローラーを作成しています。管理セクション内のすべてのコントローラーは、それを継承します。

#app/controllers/admins/base_controller.rb

class Admins::BaseController < ApplicationController
  layout "admin_cms"
  before_filter :authenticate_admin!
end

-

#spec/controllers/admins/base_controller_spec.rb

require 'spec_helper'

describe Admins::BaseController do
  controller do
    def index
    end
  end

  describe "before_filter#authenticate_admin!" do
    before(:each) do
      @admin = FactoryGirl.create(:admin)
      @request.env["devise.mapping"] = Devise.mappings[:admin]
    end

    context "when admin is not logged in" do
      it "redirect admin to sign_in path" do
        get :index
        response.should redirect_to new_admin_session_path
      end
    end

  end
end

私は既に私の spec_helper.rb に Devise::TestHelpers を含めましたが、この仕様を実行するとこのエラーが発生します:

Admins::BaseController
  before_filter#authenticate_admin!
    when admin is not logged in
      redirect admin to sign_in path (FAILED - 1)

Failures:

   1) Admins::BaseController before_filter#authenticate_admin! when admin is not logged     in redirect admin to sign_in path
     Failure/Error: get :index
     ActionView::MissingTemplate:
       Missing template anonymous/index, application/index with {:locale=>[:en],     :formats=>[:html], :handlers=>[:erb, :builder, :coffee]}. Searched in:
         * "#<RSpec::Rails::ViewRendering::EmptyTemplatePathSetDecorator:0xbaf75d4>"
     # ./spec/controllers/admins/base_controller_spec.rb:17:in `block (4 levels) in <top (required)>'

Finished in 0.17124 seconds
1 example, 1 failure

Failed examples:

rspec ./spec/controllers/admins/base_controller_spec.rb:16 # Admins::BaseController   before_filter#authenticate_admin! when admin is not logged in redirect admin to sign_in path

仕様を次のように変更しました。

require 'spec_helper'

describe Admins::BaseController do
  controller do
    def index
      render nothing: true
    end
  end

  describe "before_filter#authenticate_admin!" do
    context "when admin is not logged in" do
      it "redirect admin to sign_in path" do
        get :index
        response.should redirect_to new_admin_session_path
      end
    end

  end
end

そして今、私はこのエラーが発生しています:

Failures:

  1) Admins::BaseController before_filter#authenticate_admin! when admin is not logged in redirect admin to sign_in path
     Failure/Error: response.should redirect_to new_admin_session_path
       Expected response to be a <:redirect>, but was <200>

それで、何らかの理由で、authenticate_admin に入っていません! フィルター前。私はちょっと迷っています。再度、感謝します。

Rails 3.2.13、Ruby 2.0.0、Rspec-rails 2.13.0、Devise 2.2.3 を使用しています。誰かがこれで私を助けてくれれば、本当に感謝しています。前もって感謝します。

4

1 に答える 1

4

3 時間後、匿名コントローラーの定義に問題があることがわかりました。

それ以外の:

controller do
  def index
  end
end

私が使用した:

controller(Admins::Base) do
  def index
  end
end

ApplicationController がテストしようとしているものでない限り、テストしている匿名コントローラーを常に指定する必要があります。

于 2013-03-20T18:19:04.943 に答える