4

フィクスチャを使用せずに(モックモデルを使用する代わりに)コントローラの仕様を作成しようとしています。このコントローラーでは、作成者の推奨に従って、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

UserSession.create(...)これらの例はすべて、次の効果を報告して、行で失敗します。

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

これを解決する方法がわかりません。:changed? => false適切に嘲笑していますか?

4

4 に答える 4

6

Iainは、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

私はこれを私のスペックに取り入れました、そしてそれは私が望んでいたことを正確に実行することがわかりました。ログインしたユーザーのモックモデルを使用するコントローラーの仕様が機能しているので、ユーザーにフィールドを追加してもすべてが壊れることはありません。これを仕様に実装するIainの例は次のとおりです。

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

PS私は自分の質問に答えるのが嫌いですが、これが私が探していた答えです。私はそれを十分に早く見つけられませんでした。

于 2009-06-23T15:10:32.700 に答える
1

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

class UserSession < Authlogic::Session::Base
  extend ActiveModel::Naming
end
于 2011-03-25T15:51:49.143 に答える
1

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

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

最後のオプションは、任意のメソッドに応答するモックを渡すことです (これは method_missing を介して簡単に実現できます)。この解決策の問題点は、どの値が特定のメソッド呼び出しを返す必要があるかが事前にわからないことです。

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

于 2009-06-22T07:06:19.207 に答える
0

authlogic オブジェクトのモッキングは難しいことがわかり、最終的にモッキングをあきらめました。代わりに、オブジェクト daddyを使用したジェネレーター アプローチを使用するようになりました。私の機能テストは今ではとても幸せです。ところで、 + object_daddyは絶対にうまくいくはずです。Shoulda のトランザクション コンテキストにより、テスト データベースがクリーンな状態に保たれ、最初から単純なアクティブ レコード オブジェクトをモックする必要がなくなります。

于 2009-06-22T10:43:49.407 に答える