Какова фактическая стратегия тестирования сильной фильтрации параметров в контроллере Rails с помощью Rspec? (За исключением помощников по назначению) Как написать неудачный тест, а затем сделать его зеленым?
Как проверить сильные параметры с помощью Rspec?
Ответ 1
Создайте 2 хэша с ожидаемыми и всеми (с неудовлетворенными) параметрами. Затем передайте все параметры в действие и убедитесь, что объектная модель получает только ожидаемые параметры. Это не произойдет, если вы не используете сильные фильтры параметров. Затем добавьте разрешения для параметров и снова проверьте тест.
Например, это:
# action
def create
User.create(params)
end
# spec
it 'creates a user' do
expect_any_instance_of(User).to receive(:create).
with({name: 'Sideshow Bob'}.with_indifferent_access)
post :create, user:
{ first_name: 'Sideshow', last_name: 'Bob', name: 'Sideshow Bob' }
end
передаст все параметры пользователю, и тест завершится с ошибкой. И когда вы их фильтруете:
def user_params
params.require(:user).permit(:name)
end
и измените действие с помощью User.create(user_params)
, тест пройдет.
Ответ 2
Я лично использую shoulda-matcher от мыслителя.
С чем-то вроде:
it do
should permit(:first_name, :last_name, :email, :password).
for(:update, params: params)
end
Ответ 3
Вот как я это сделал:
describe 'Safe Params' do
let(:mixed_params) {
{
blueprint_application_environment: {
id: 1000,
blueprint_id: 1,
application_id: 2,
environment_id: 3
},
format: :json
}
}
context "when processing a Post request with a mix of permitted and unpermitted parameters" do
before { post :create, mixed_params }
it "a create will not set the value of the unpermitted parameter" do
expect(JSON.parse(response.body)["id"]).not_to eq(1000)
end
it "a create will set the value of the permitted parameters" do
expect(JSON.parse(response.body)["blueprint_id"]).to eq(1)
expect(JSON.parse(response.body)["application_id"]).to eq(2)
expect(JSON.parse(response.body)["environment_id"]).to eq(3)
end
end
конец
Код контроллера:
def create
@blueprint_application_environment = BlueprintApplicationEnvironment.new(blueprint_application_environment_params)
if @blueprint_application_environment.save
render 'show.json.jbuilder'
else
render json: @blueprint_application_environment.errors, status: :unprocessable_entity
end
end
def blueprint_application_environment_params
params.require(:blueprint_application_environment).permit(:blueprint_id, :application_id, :environment_id)
end
Ответ 4
как будто вы создаете или обновляете объект с использованием сильных параметров, это также похоже, за исключением того, что вы обычно делаете так:
post: create, book_id: @book.id
Но в сильном параметре вы должны сделать вот так:
post: create, {book_id: @book.id, комментарий: {user_id: 101, book_id: @book.id, описание: "стоит купить" }}
вам нужно передать вложенные параметры.