Je voudrais tester une validation effectuée sur un attribut de la classe suivante:
class R
include ActiveModel::Validations
attr_reader :attribute
validates :attributes, presence: true
def initialize(attribute = {})
@attribute = attribute
end
end
Maintenant, mon test est comme ça:
RSpec.describe R, type: :model do
context "validations" do
subject { R.new(1) }
it { should validate_presence_of(:attribute) }
end
end
Mais cela entraîne une erreur:
NoMethodError:
undefined method `attributes=" for
Si je change l'attribut attr_reader en un attr_accessor, le test réussit.
Comment puis-je laisser l'attribut attr_read tel qu'il est et continuer à faire passer le test avec l'adaptateur Shoulda?
Réponses:
1 pour la réponse № 1Shoulda "s validate_presence_of
fonctionne en essayant de définir une valeur vide sur l’argument, il a donc besoin d’une méthode de définition et ne peut pas fonctionner avec attr_reader uniquement.
0 pour la réponse № 2
Vous pourriez probablement stub attribute=
sur le sujet:
RSpec.describe R, type: :model do
context "validations" do
subject { R.new(1) }
before { subject.stub("attribute=") { |arg| subject.instance_variable_set(:attribute, arg) } }
it { should validate_presence_of(:attribute) }
end
end
Haven "t testé cela cependant.