0
我这有轨道4控制器是这样的:Rspec的集成:一个参数是丢失或为空
class UsersController < ApplicationController
before_action :set_user, only: [:edit, :update, :delete]
# ...
api :POST, '/users', "Creates a new user"
param :username, String, :required => true, :desc => "Desired username"
param :email, /[a-zA-Z0-9\-.]+\@[a-zA-Z0-9\-.]+\.[a-z]{2,}/, :required => true, :desc => "User's e-mail address"
param :password, String, :required => true, :desc => "SHA256(username:password), hex encoded"
param :screenname, String, :required => true, :desc => "Publicly visible name"
param :avatar, String, :required => true, :desc => "Uploaded avatar filename"
error :code => 422, :desc => "Unprocessable entity"
def create
@user = User.new(user_params)
respond_to do |format|
if @user.save
format.json { render :show, status: :created, location: @user }
else
format.json { render json: @user.errors, status: :unprocessable_entity }
end
end
end
# ...
private
# ...
def user_params
params.require(:user).permit(:username, :email, :password, :screenname)
end
end
,然后我有一个RSpec的测试这样
describe "POST /users.json" do
let!(:daniel_attrs) { FactoryGirl.attributes_for(:user, username: "daniel", email: "[email protected]", password: "999d53a384afd57ebc36986fe9455c6e941cd844467e28f975289845d6e984ee", screenname: 'Daniel', avatar: "default.png") }
before :each do |example|
post '/users.json', daniel_attrs
end
# ...
end
从而未能像这样
1) Users API POST /users.json creates the user with the right parameters
Failure/Error: post '/users.json', daniel_attrs
ActionController::ParameterMissing:
param is missing or the value is empty: user
# ./app/controllers/users_controller.rb:155:in `user_params'
# ./app/controllers/users_controller.rb:72:in `create'
# ./spec/requests/usersapi_spec.rb:85:in `block (3 levels) in <top (required)>'
我不明白的是为什么控制器甚至需要在请求中的'用户'键,因为如果我伪造一个请求(通过卷发,邮差,不管),我只包括我的属性的JSON表示,它正确地创建对象。如果反正我提供密钥(如)测试失败这样
1) Users API POST /users.json creates the user with the right parameters
Failure/Error: post '/users.json', :user => daniel_attrs
Apipie::ParamMissing:
Missing parameter username
# ./spec/requests/usersapi_spec.rb:85:in `block (3 levels) in <top (required)>'
,我知道的一个事实(因为我用let!
因为我打印出来),其daniel_attrs
拥有所有的键和值在正确的地方。
我敢肯定我错过了一件非常明显的事情,我很长时间没有在钢轨上进行测试。那么,我错过了什么?
编辑:通常,这将是大规模有用得到执行之前,他们检查的请求。有没有办法做到这一点?
编辑2:修改所述apipie定义当这样
api :POST, '/users', "Creates a new user"
param :user, Hash, :required => true do
param :username, String, :required => true, :desc => "Desired username"
param :email, /[a-zA-Z0-9\-.]+\@[a-zA-Z0-9\-.]+\.[a-z]{2,}/, :required => true, :desc => "User's e-mail address"
param :password, String, :required => true, :desc => "SHA256(username:password), hex encoded"
param :screenname, String, :required => true, :desc => "Publicly visible name"
param :avatar, String, :required => true, :desc => "Uploaded avatar filename"
end
error :code => 422, :desc => "Unprocessable entity"
def create
@user = User.new(user_params)
respond_to do |format|
if @user.save
format.json { render :show, status: :created, location: @user }
else
format.json { render json: @user.errors, status: :unprocessable_entity }
end
end
end
是的,我尝试了两种替代方案,他们都没有工作。奇怪的是,抱歉没有提及,我在创建方法之前有一个apipie部分(请参阅编辑),该方法没有将参数分组在用户哈希下。我说“奇怪”,因为这些错误根本没有提到apipie。 – Morpheu5