Я использую Rails для написания контроллера, получающего JSON в качестве своих параметров, и затем тестирую его с помощью спецификации запроса Rspec.
controller:
class API::UserController < ApplicationController
def create
@user = User.new(user_params)
if @user.save
redirect_to @user
else
render json: { errors: @user.errors.full_messages }, status: :unprocessable_entity
end
private
def user_params
params.require(:user).permit(:username, :email, :name, :password_digest)
end
end
spec:
RSpec.describe "User creation", type: :request do
def create_user_request
params = { user: build(:user), format: :json }
post api_users_path, params: params.to_json
end
it 'should create a new user' do
expect { create_user_request }.to change { User.count }.by(1)
end
Но это не так:
Failure/Error: params.require(:user).permit(:username, :name, :email, :password_digest)
ActionController::ParameterMissing:
param is missing or the value is empty: user
Я думаю, проблема в том, что params
в контроллере представляет собой сериализованный объект JSON в виде строки.Если я заменю params: params.to_json
на params: params
в моей спецификации, тогда параметры user
станут строкой "#<User:0x.....>"
.
Как сделать так, чтобы спецификация и контроллер хорошо играли вместе?