2017-07-26 39 views
1

我有UsersControllerHOWTO正確軌道API rspec的JSON測試

def create 
    @user = User.create(user_params) 
    if @user.save 
    render json: @user, status: :created 
    else 
    render json: @user, status: :unprocessable_entity 
    end 
end 

我需要測試這與RSPEC創建行動。你可以請大家幫忙,如何做正確

我堅持這個代碼

RSpec.describe UsersController, type: :controller do 
    # Test for POST /users 
    describe 'POST /users' do 
    let(:user) { User.create(email: '[email protected]', password: 'abc123', token: 'anytokenhere') } 
    context '#check valid request' do 

     before { post 'create', params: user } 

     it 'creates a user' do 
     json = JSON.parse(response.body) 
     expect(json['email']).to eq('[email protected]') 
     expect(json['password']).to eq('abc123') 
     end 

     it 'returns status code 201' do 
     expect(response).to have_http_status(201) 
     end 
    end 

    end 
end 

得到了以下錯誤:

Failures: 

    1) UsersController POST /users #check valid request creates a user 
    Failure/Error: before { post 'create', params: user } 

    NoMethodError: 
     undefined method `symbolize_keys' for #<User:0x0055f95cee9a48> 
    # ./spec/controllers/users_controller_spec.rb:9:in `block (4 levels) in <top (required)>' 

    2) UsersController POST /users #check valid request returns status code 201 
    Failure/Error: before { post 'create', params: user } 

    NoMethodError: 
     undefined method `symbolize_keys' for #<User:0x0055f95cbebbc0> 
    # ./spec/controllers/users_controller_spec.rb:9:in `block (4 levels) in <top (required)>' 
+0

我建議你使用https://github.com/zipmark/rspec_api_documentation來測試你的控制器。它具有簡單的語法,並可免費獲得文檔。 –

回答

1

的問題是,你提供User模型作爲參數Hash預計。

這是一個POST請求/users的作品的例子:

RSpec.describe UsersController, type: :controller do 
    # Test for POST /users 
    describe 'POST /users' do 
    let(:user) { User.last } 

    context '#check valid request' do 
     before { post 'create', params: { user: { email: '[email protected]', password: 'abc123', token: 'anytokenhere' } } } 

     it 'creates a user' do 
     json = JSON.parse(response.body) 
     expect(user.email).to eq('[email protected]') 
     end 

     it 'returns status code 201' do 
     expect(response).to have_http_status(201) 
     end 
    end 

    end 
end 
+0

非常感謝!你太快了。有用。據我瞭解'''let(:user){User.last}'''是可選的,沒有它,一切正常。 – fernal9301

+0

'let(:user){User.last}'是讓最後一個用戶(剛剛創建)並驗證其電子郵件。但是,當然,這取決於你如何設計你的代碼:) –