Как протестировать массовое назначение в Rails 4 с помощью RSpec

Учитывая простую модель пользователя в 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).

Заранее спасибо!


person Tom    schedule 28.02.2013    source источник
comment
взгляните на github.com/thoughtbot/shoulda-matchers   -  person Muhamamd Awais    schedule 28.02.2013
comment
Не похоже, что это работает в настоящее время, получая: NoMethodError: неопределенный метод `active_authorizer' (вероятно, из-за того, что Rails 4 находится в бета-версии)   -  person Tom    schedule 28.02.2013
comment
описать пользователя сделать это { should_not allow_mass_assignment_of(:admin) } end -------› использовать его сверху   -  person Gopal S Rathore    schedule 28.02.2013
comment
Это не имеет значения для ошибки - я обновлю вопрос для справки.   -  person Tom    schedule 28.02.2013
comment
Это ответ, который я разместил на аналогичный вопрос: stackoverflow.com/a/26661956/2183673   -  person Rebekah Waterbury    schedule 30.10.2014


Ответы (1)


it "should not allow mass assignment" do
  raw_parameters = { :admin => 1 }
  parameters = ActionController::Parameters.new(raw_parameters)
  expect {@user.update_attributes(parameters)}.should raise_error
end

Чтобы протестировать массовое назначение, вы должны смоделировать параметры передачи от контроллера.

https://github.com/rails/strong_parameters#use-outside-of-controllers

person Vladimir Tsukanov    schedule 28.02.2013
comment
Это все еще терпит неудачу с отказом/ошибкой: это { should_not be_admin } ожидаемый администратор? вернуть false, получить true - person Tom; 28.02.2013
comment
у вас есть attr_accessible или attr_protected в вашей модели пользователя? - person Vladimir Tsukanov; 28.02.2013
comment
Это Rails 4, attr_accessible больше не используется, так как он заменен сильными параметрами? (Так что нет, в ответ на ваш вопрос) - person Tom; 28.02.2013
comment
Извините, тоже не работает - это проходит как без :admin, так и с :admin в методе .permit в контроллере. - person Tom; 28.02.2013
comment
Как ни странно, даже если добавить :admin в список разрешений, ваш код в консоли вызывает: ActiveModel::ForbiddenAttributesError: ActiveModel::ForbiddenAttributesError - person Tom; 28.02.2013
comment
в моей консоли @user.update_attributes(params) поднимается. Но @user.update_attributes(params).permit(:admin) все в порядке. - person Vladimir Tsukanov; 28.02.2013