1

RSpec テストで Devise と Declarative をうまく動作させるのに本当に苦労しました。

https://github.com/stffn/declarative_authorization/issues/95

機能テストでセッション変数を補足した後の stringify_keys エラー

これらは両方とも私の問題に対処しますが、どちらも私にとってはうまくいく解決策がありませんでした。

# practices_controller_spec.rb
it "assigns a new practice as @practice as owner" do
  get_action(:new, @owner)
  assigns(:practice).should be_a_new(Practice)
  sign_out @owner
end

def get_action(action,user,*id)
  sign_in user
  get_with user, action, {:id => id}, session
end

# Spec test yields
Failure/Error: get_with user, action, {:id => id}, session
 NoMethodError:
   private method `stringify_keys' called for #<ActionController::TestSession:0x00000100d8a170>

Session looks like this: {"warden.user.user.key"=>["User", [1840], "$2a$04$2Rq4bHGp.tlIgKHE4PlRle"]}

このエラーを解決するための提案はありますか?

どんな助けでも大歓迎です。ありがとう!

アップデート

私はこれを行うことでそれを機能させました:

  def get_action(action,user,*id)
  sign_in user
  hashy = session['warden.user.user.key'][2]
  get_with user, action, {:id => id}, {"warden.user.user.key"=>["User", [user.id],hashy]}, nil

終わり

4

1 に答える 1

0

あなたの更新は、同じ問題を解決するのに本当に役立ちました。Rails 3.0 を 3.1 にアップグレードし、Devise および Declarative Authorization gem を使用している (おそらく今ではほとんどいない) 人に役立つことを期待して、ソリューションを少し拡張できれば。

RSpec ではなく Test::Unit を使用していますが、これは簡単に統合できると思います。以下を ActiveSupport::TestCase (またはテストケース クラスが RSpec で継承するもの) に追加します。これを行うと、他のセッションのキーと値のペアもリクエストに渡されることが保証されます。

class ActiveSupport::TestCase
  include Authorization::TestHelper # provides the declarative authorization get_with method

  def session_hash(user)
    temp_session = session.dup
    temp_session.delete("warden.user.user.key")
    {"warden.user.user.key"=>["User", [user.id],session['warden.user.user.key'][2]]}.merge(temp_session)
  end
end

そしてあなたのメソッドでは、 get_with リクエストはセッションの代わりに session_hash(user) を使用します。Test::Unit では、最後の nil は必要ありませんでした

def get_action(action,user,*id)
  sign_in user
  get_with user, action, {:id => id}, session_hash(user)
end

Declarative Authorization は Rails 3.1 の ActionController::TestSession が気に入らないようです

于 2013-05-20T16:19:06.133 に答える