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?

Était-ce utile?

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) }
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top