2014-07-25 27 views
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 

回答

2

這是因爲你的控制器的方法user_params作品。

我想你可以試試這個:

def user_params 
    params.permit(:username, :email, :password, :screenname) 
end 

編輯:對不起,我錯過了你的帖子的一部分,所以你知道這個問題是因爲「用戶」鍵。 如果您想保留用戶的關鍵,你可以試試下面的語法(我想它和它的作品)

post :create, user: daniel_attrs 

希望這有助於。

+0

是的,我嘗試了兩種替代方案,他們都沒有工作。奇怪的是,抱歉沒有提及,我在創建方法之前有一個apipie部分(請參閱編輯),該方法沒有將參數分組在用戶哈希下。我說「奇怪」,因爲這些錯誤根本沒有提到apipie。 – Morpheu5

相關問題