2009-06-22 8 views
4

私は、モックモデルを使用する代わりに、フィクスチャを使用せずにコントローラのスペックを書き込もうとしています。このコントローラでは、ユーザがログインする必要があります。そのためにはAuthLogicを採用しており、author's recommendationsに続いています。これらの例はすべての効果に報告、ラインUserSession.create(...)で失敗AuthLogicコントローラ仕様で模擬モデルを使用するにはどうすればよいですか?

describe UsersController do 

    def mock_user(stubs={}) 
    @mock_user ||= mock_model(User, stubs) 
    end 

    context 'when logged in' do 
    before { activate_authlogic } 

    it "exposes the logged-in user as @user in response to GET (show)" do 
     UserSession.create(mock_user) 
     ... 
    end 

    ... 
    end 

    ... 
end 

Mock 'User_1005' received unexpected message :changed? with (no args) 

私はこの問題を解決するかどうかはわかりません。 :changed? => falseが適切であると嘲笑していますか?

答えて

6

イアンは、solution to using mock objects with AuthLogicを投稿しました。言い換えるするには、以下のヘルパーはspec_helpers.rbに入る:

def current_user(stubs = {}) 
    @current_user ||= mock_model(User, stubs) 
end 

def user_session(stubs = {}, user_stubs = {}) 
    @current_user_session ||= mock_model(UserSession, {:user => current_user(user_stubs)}.merge(stubs)) 
end 

def login(session_stubs = {}, user_stubs = {}) 
    UserSession.stub!(:find).and_return(user_session(session_stubs, user_stubs)) 
end 

def logout 
    @user_session = nil 
end 

私は私のスペックにこれを組み入れてきた、と私はそれは私が望んでいたまさにないことが判明。私はログインしているユーザのモックモデルをエクスポーティングするコントローラ仕様を持っているので、ユーザにフィールドを追加するとすべてが破損することはありません。スペックでこれを実装するのイアンの例があるとして:

describe SecretsController do 
    before { login } 
    it "should be very very secret!" 
end 

P.S.私自身の質問に答えるのは嫌ですが、これは私が探していた答えです。私はちょうどそれを早期に見つけられませんでした。

1

Authlogicは、レコードがアクティブレコードインスタンスのように動作することを期待しています。実際のインスタンスやモックを使うことができますが、モック/スタブを使用する場合は、Authlogicが必要とするすべてのメソッドに応答する必要があります。

モックの代わりに実際のアクティブなレコードオブジェクトを使用することをお勧めします。フィクスチャを使用したくない場合は、ファクトリを使用できます。

最後のオプションは、どのメソッドにも反応するモックを渡すことです(これはmethod_missingで簡単に行うことができます)。その解決策の問題は、特定のメソッド呼び出しを返す値を事前に知っていないことです。

はい、falseを渡すことはできますが、これは実際の解決策ではありません。モックオブジェクトがすべてのAuthlogicリクエストに答えるまで、手動でデフォルト値を試してみる必要があります。しかし、これはあなたのスタブへの未応答のコールを修正するために、内部的な変更についてauthlogicに常に従うことを要求します。

+0

セッションオブジェクトで、それほど多くのケースをカバーすることはありませんか? これは私が心配していることです:あなたは明白な一連のケースをカバーしている場合、特に明らかにラベルを付けることができれば、照明器具は非常にうまくいくようです。 "admin_user"と "registered_user"です。ラベル付けが難しくなるとすぐに、「quentinがログインしたらXが表示されたら」という意味のテストコードを取得し始めます。これは私には何の意味もありません。 セッションは自分自身に適していますか? –

0

私はauthlogicオブジェクトを嘲笑しているとわかっていましたが、私は最終的に嘲笑してしまいました。代わりに、今私はobject daddyを使用して発電機のアプローチを使用します。私の機能テストは今よりずっと幸せです。 BTW、shoulda + object_daddyは絶対に揺れます。 Shouldaのトランザクションコンテキストは、私のテストデータベースがきれいなままであることを保証し、最初は単純なactiverecordオブジェクトをモックする必要はありません。

1

Rails 3では、AuthLogicのUserSessionはActiveRecord :: Baseのインスタンスではないため、このUserSessionのモッキングはもはや機能しません。私のために働く修正:

class UserSession < Authlogic::Session::Base 
    extend ActiveModel::Naming 
end 
関連する問題