Search code examples
ruby-on-railsrspecrspec2rspec-rails

How to test attr_accessible fields in RSpec


So we have been setting up attr_accessible and attr_protected on many fields through out our Rails 3.2 app. For now we really don't test to ensure that these fields are protected.

So I decided to google some answers and stumbled upon this 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

But this solution only test's to see if the method is responding. What I need is a way for me to test that attributes can and can't be mass assigned. I honestly love the syntax

it { should_not be_accessible :field_name }
it { should be_accessible :some_field }

Does anyone have a better solution to this problem?


Solution

  • You can check if the attribute is on #accessible_attributes list

    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