Как проверить поля attr_accessible в RSpec - PullRequest
23 голосов
/ 16 февраля 2012

Итак, мы настраивали attr_accessible и attr_protected во многих полях через наше приложение Rails 3.2.Пока мы действительно не тестируем, чтобы убедиться, что эти поля защищены.

Поэтому я решил погуглить некоторые ответы и наткнулся на это решение:

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

Но это решение только дляпосмотрите, отвечает ли метод.Мне нужен способ проверить, что атрибуты могут и не могут быть назначены массово.Я искренне люблю синтаксис

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

У кого-нибудь есть лучшее решение этой проблемы?

Ответы [ 3 ]

32 голосов
/ 16 февраля 2012

Вы можете проверить, есть ли атрибут в #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
28 голосов
/ 09 августа 2012

Я искал что-то похожее, а затем мне сказали о musta-matcher allow_mass_assigment_of.Это сработало для меня без создания собственного сопоставителя.

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

Надеюсь, это поможет кому-то еще.

1 голос
/ 29 мая 2013

Если по какой-то причине RSpec запускает ответ выше juicedM3, как мой, вы можете сделать что-то вроде этого:

specify { expect { Model.new(unaccessible_attr: value) }.to raise_error(ActiveModel::MassAssignmentSecurity::Error) }
...