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