2014-07-25 19 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

相关问题