RSpec - Тестирование сильных параметров

Я использую strong_parameters gem в моих контроллерах, но мне трудно понять, как я его протестирую.

Вот пример моей установки

class UserController < ActionController::Base
  include ActiveModel::ForbiddenAttributesProtection

  def create
    @user = User.new(user_params)
    if @user.save
      ...
    end
  end

  private
  def user_params
    params.require(:user).permit(:first_name, :last_name, :username, :email)
  end
end

Я хочу протестировать метод user_params, чтобы убедиться, что он правильно отфильтровывает пары вредоносных ключей/значений, но не может понять, как это сделать. Кто-нибудь еще прошел через это?

Ответ 1

Вы можете заглушить хеш params как

params = ActionController::Parameters.new(your_hash)

Это класс, в котором ваши параметры URL преобразуются в ваш контроллер, и он дает вам необходимые и разрешающие методы.

Я лично извлекаю функционально из нового класса для обработки политики авторизации.

Ответ 2

Измените это в соответствии с вашими потребностями,

describe "create action" do
    it 'creates a user' do
      User.should_receive(:create).
        with({name: 'Alan D'}.with_indifferent_access)
      post :create, user:
        { first_name: 'Alan', last_name: 'Donald', username: 'alan77', email: '[email protected]' }
    end
end

или другое альтернативное решение этой проблемы:

describe UsersController::UserParams do
  it 'cleans the params' do
    params = ActionController::Parameters.new(user: {foo: 'bar', name: 'baz'})
    user_params = UsersController::UserParams.build(params)
    expect(user_params).to eq({name: 'baz'}.with_indifferent_access)
  end
end

Ответ 3

Я не уверен, что буду тестировать strong_parameters, который, как я предполагаю, вы используете через драгоценный камень.

У драгоценного камня свои собственные тесты, поэтому мы можем предположить, что он работает как ожидалось.

Это пример "проверки Rails", который, я считаю, не нужен. Я бы не тестировал, что attr_accessible работает как рекламируемый (Testing Rails), или attr_accessor (Testing Ruby).

IMHO, ваши интеграционные тесты должны охватывать все желаемые примеры успеха/сбоя и неявно покрывать вашу конфигурацию strong_parameter.