Учитывая простую модель пользователя в Rails 4 с именем, адресом электронной почты и логическим значением администратора, каков наилучший подход к тестированию массового назначения с использованием RSpec?
Вот UsersController:
def create
@user = User.new user_params
...snip
end
private
def user_params
params.require(:user).permit(:name, :email)
end
и две разные попытки проверить это:
в user_spec.rb
describe "accessible attributes" do
describe "should not allow access to admin" do
before do
@user.admin = "1"
@user.save
end
it { should_not be_admin }
end
end
или в users_controller_spec.rb
it 'should only allow name and email to be set' do
@controller.user_params.keys.should eq(['name', 'email')
end
Ни один из них не работает - первый просто создает пользователя с правами администратора (провал теста) - предположительно, это обходит strong_parameters. Последнее работает, но только если метод user_params не является приватным. (Официальные документы рекомендуют установить его как частный. Примечание. Отслеживание ошибки MassAssignment в user_spec также не работает (ошибка не возникает).
Примечание. На самом деле установка пользователя в качестве администратора в представлении работает правильно - атрибут администратора отфильтрован, и все устраивает, но очень хотелось бы, чтобы это работало правильно в тесте.
Альтернативное предложение — использовать гем shoulda-matchers с user_spec.rb:
describe User do
...
it { should_not allow_mass_assignment_of(:admin) }
...
end
(это тоже не работает), давая:
Failure/Error: it { should_not allow_mass_assignment_of(:admin) }
NoMethodError:
undefined method `active_authorizer' for #<Class:0x007f93c9840648>
(Я предполагаю, что эта ошибка связана с тем, что shoulda-matchers еще не совместимы с Rails 4).
Заранее спасибо!