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
.