J'ai les classes ActiveRecord suivantes:Comment tester un named_scope qui fait référence à un attribut de classe avec Shoulda?
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
et je suis en train de tester le named_scope :current_user
en utilisant Shoulda mais ce qui suit ne fonctionne pas.
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
La raison pour laquelle il ne fonctionne pas est parce que l'appel à User.current_user
dans la méthode should_have_named_scope
est en cours d'évaluation lorsque la classe est définie et je suis changer la valeur de current_user
ensuite dans le bloc setup
lors de l'exécution du tester.
Voici ce que je suis venu avec pour tester cette 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
Alors, comment voulez-vous tester cela en utilisant Shoulda?
Les opérateurs logiques Ruby (&&, ||) ne fonctionnent pas comme vous le suggérez. Ils renvoient le dernier argument évalué.Ainsi, le code current_user ne retournera un booléen que si User.current_user ou User.current_user.id est un booléen - ce que je suppose que ce n'est pas le cas. – Chuck
Oups, vous avez raison! Boire tôt le matin n'aidait pas avec mes compétences Ruby. –