Comment tester les champs attr_accessible dans RSpec
-
25-10-2019 - |
Question
Nous avons donc été de mettre sur pied attr_accessible
et attr_protected
sur de nombreux domaines à travers nos Rails 3.2 app. Pour l'instant on n'a pas vraiment test pour vous assurer que ces champs sont protégés.
Alors j'ai décidé de google quelques réponses et sommes tombés sur cette solution:
RSpec::Matchers.define :be_accessible do |attribute|
match do |response|
response.send("#{attribute}=", :foo)
response.send("#{attribute}").eql? :foo
end
description { "be accessible :#{attribute}" }
failure_message_for_should { ":#{attribute} should be accessible" }
failure_message_for_should_not { ":#{attribute} should not be accessible" }
end
Mais que cette solution est test pour voir si la méthode répond. Ce que je besoin est un moyen pour moi de tester que les attributs peuvent et ne peuvent pas être affectés de masse. J'aime sincèrement la syntaxe
it { should_not be_accessible :field_name }
it { should be_accessible :some_field }
quelqu'un a une meilleure solution à ce problème?
La solution
Vous pouvez vérifier si l'attribut est sur la liste de #accessible_attributes
RSpec::Matchers.define :be_accessible do |attribute|
match do |response|
response.class.accessible_attributes.include?(attribute)
end
description { "be accessible :#{attribute}" }
failure_message_for_should { ":#{attribute} should be accessible" }
failure_message_for_should_not { ":#{attribute} should not be accessible" }
end
Autres conseils
Je cherchais quelque chose de semblable, puis on m'a dit au sujet de la allow_mass_assigment_of Shoulda-matcher. Cela a fini par travailler pour moi sans créer un matcher personnalisé.
it { should allow_mass_assignment_of :some_field }
it { should_not allow_mass_assignment_of :field_name }
Espérons que cela aide quelqu'un d'autre.
Si pour une raison quelconque RSpec trébuche sur la réponse de juicedM3 ci-dessus comme le mien était que vous pouvez faire quelque chose comme ceci:
specify { expect { Model.new(unaccessible_attr: value) }.to raise_error(ActiveModel::MassAssignmentSecurity::Error) }