次の ActiveRecord クラスがあります。
class User < ActiveRecord::Base
cattr_accessor :current_user
has_many :batch_records
end
class BatchRecord < ActiveRecord::Base
belongs_to :user
named_scope :current_user, lambda {
{ :conditions => { :user_id => User.current_user && User.current_user.id } }
}
end
私はShouldanamed_scope :current_user
を使ってテストしようとしていますが、以下はうまくいきません。
class BatchRecordTest < ActiveSupport::TestCase
setup do
User.current_user = Factory(:user)
end
should_have_named_scope :current_user,
:conditions => { :assigned_to_id => User.current_user }
end
それが機能しない理由は、クラスが定義されているときにメソッドUser.current_user
内の呼び出しが評価されており、テストの実行時にブロック内の値を後で変更しているためです。should_have_named_scope
current_user
setup
このnamed_scopeをテストするために私が思いついたのは次のとおりです。
class BatchRecordTest < ActiveSupport::TestCase
context "with User.current_user set" do
setup do
mock_user = flexmock('user', :id => 1)
flexmock(User).should_receive(:current_user).and_return(mock_user)
end
should_have_named_scope :current_user,
:conditions => { :assigned_to_id => 1 }
end
end
では、これをShouldaを使用してどのようにテストしますか?