2011-10-19 9 views
1

DevpecとDeclarativeがRSpecテストでうまくやっているのは本当に苦労しています。Rails 3.1でRSpecを使用したDeviseとDeclarative Testingのキー化エラー

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

stringify_keys error after supplementing session variables in functional tests

これらの私の問題に対処しますが、どちらも私のために働いたソリューションを持っていた両方。

# 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"]} 

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

ご協力いただければ幸いです。ありがとう!私はそれがこれを行うことによって動作するようになった

UPDATE

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 

エンド

答えて

0

あなたのアップデートは、本当に私は同じ問題を解決する助けました。あなたのソリューションを少しでも拡張できれば、これはRails 3.0を3.1にアップグレードし、DeviseとDeclarative Authorizationの宝石を使用している人々にとって(おそらくごくわずかな)人々に役立つかもしれません。

私は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)を使用します。テスト::ユニットでは最後のnilは宣言による認可は、Railsの3.1

からActionController :: TestSessionを好きではないようだ

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

必要はありませんでした

関連する問題