2

devise と warden のカスタム承認戦略につながるものはたくさんありますが、私が特に求めているのは、これらのソリューションを rspec でテストすることです。この質問に似ています: Devise でサインインできるユーザーのフィルタリング

この種の実装をテストするにはどうすればよいですか。Rails 3.1.1、Devise (最新) など

4

1 に答える 1

12

将来これを行う可能性がある人のために、ここに私の解決策があります:

これは、Deviseを介した認証の新しい戦略を設定するクラスです(Wardenでも、いくつかの小さな変更を加えて使用できます)。

require 'devise/strategies/authenticatable'

module Devise
  module Strategies
    class AndroidAuthenticatable < Authenticatable
      def valid? 
        # return true/false
                return valid_params? && valid_headers?
      end 

      def authenticate! 
        failure_message = "Authentication failed for device/user"

        klass = mapping.to # if we're going to come here, we can mock this
        begin
          # code to determine whether or not to authenticate this request
          # if yes, success!(instance of klass)
          # if no, fail!(messsage)
        rescue
          fail!(failure_message) # always fail if not success
        end
      end 

      protected
      def valid_params?
        # params that show whether request should be here
      end

      def valid_headers?
        # headers that determine if request should be here
      end
    end
  end
end

前のクラスは私のlib/.../strategiesディレクトリにあります。また、rails構成を介して自動ロードするようにlibを構成しました。

rspec側から、上記のクラスを作成した後、いくつかのスタブ/モックを書き出します。これがあなたが始めるための基本的なrspecファイルです。

# I do this in before block or right before test executes
@request = mock(:request)
@strategy = Devise::Strategies::AndroidAuthenticatable.new(nil)
@request.should_receive(:headers).and_return({#hash of the headers you are testing})
@strategy.should_receive(:params).at_least(:once).and_return({#hash of the params})
@strategy.should_receive(:request).and_return(@request)

# Break these up as needed to test failing and successful 
# strategies for your application
lambda {
   @strategy.should be_valid
   @strategy.authenticate!.should eql :success 
}.should_not raise_error

これはすべてを網羅しているわけではありませんが、WardenまたはDeviseで戦略を追加するときに、良いスタートを切ることができると思います。私は実際にうまくいくと思ったものを実装し、事後にそれを証明するために正しいテストをしなければなりませんでした。今、私たちはおそらく逆にそれを行うことができます。

于 2011-11-12T16:11:14.937 に答える