Как проверить attr_accessable поля в RSpec
Итак, мы настраиваем 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 }
У кого-нибудь есть лучшее решение этой проблемы?
Ответы
Ответ 1
Вы можете проверить, включен ли этот атрибут в #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
Ответ 2
Я искал что-то похожее, а затем мне сказали о том, что нужно-matcher allow_mass_assigment_of. Это закончилось тем, что работало для меня, не создавая пользовательский соединитель.
it { should allow_mass_assignment_of :some_field }
it { should_not allow_mass_assignment_of :field_name }
Надеюсь, это поможет кому-то еще.
Ответ 3
Если по какой-то причине RSpec отключается на juicedM3, ответьте выше, как у меня, вы можете сделать что-то вроде этого:
specify { expect { Model.new(unaccessible_attr: value) }.to raise_error(ActiveModel::MassAssignmentSecurity::Error) }