2017-01-13 44 views
1

在我的Rails應用程序5我使用等等這些寶石:無法更新Rspec的與設計和DeviseTokenAuth用戶,但創建和刪除做工精細

gem "devise", "~> 4.2.0" 
gem "devise_token_auth" 

我的用戶模型:

class User < ActiveRecord::Base 
    devise :database_authenticatable, :registerable, :rememberable, :trackable, :validatable 
    include DeviseTokenAuth::Concerns::User 

我無法創建更新用戶的Rspec請求。無論我嘗試過,它是失敗的:

require "rails_helper" 

RSpec.describe UsersController, type: :controller do 
describe "PATCH #update" do 
    context "with valid params" do 
     it "updates the requested user" do 
     u1 = create(:user) 
     patch :update, params: { id: u1.to_param, user: attributes_for(:user, name: "name_new", email: "[email protected]") }, 
       format: :json 

     u1.reload 
     expect(u1.name).to eq("name_new") 
     end 
    end 

事情是,一個創建和刪除用戶的測試效果很好。只有更新沒有。

它在補丁請求期間發送新參數,但用戶返回的參數始終是舊的。錯誤是什麼 - 我不知道,只是說測試失敗了。再次 - 只有一個用於更新。

我試過使用PUT和POST - 仍然失敗。

回答

0

您需要passwordpassword_confirmation來默認更新設計用戶。嘗試將它們傳入。

此路線將更新現有用戶的帳戶設置。默認的接受參數是password和password_confirmation,但可以使用devise_parameter_sanitizer系統自定義。如果config.check_current_password_before_update設置爲:attributes,則在任何更新之前檢查current_password參數,如果它設置爲:password,則只有在請求更新用戶密碼時,纔會檢查current_password參數。

+0

我已經試過了。 – Otaffa

+0

你能用錯誤跟蹤編輯你的問題嗎? –

0

這是我寫過一段時間的Rspec測試。

it 'updates a user\'s email_address and password' do 
    new_password = Faker::Internet.password(8) 
    email_address = Faker::Internet.email 

    request_params = { 
     'email' => email_address, 
     'name' => Faker::Name.name, 
     'password' => new_password, 
     'password_confirmation' => new_password 
    } 

    put '/myapp/v1/system/auth', request_params.to_json, subdomain_login(user.uid, password, account.subdomain) 
    expect(response).to have_http_status(:ok) 

    # Validating the password update with sign_in 
    request_params = { 
     'email' => email_address, 
     'password' => new_password 
    } 

    post '/myapp/v1/system/auth/sign_in', request_params.to_json, 
     { 'ACCEPT' => "application/json", 
     'Content-Type' => "application/json" } 

    expect(response).to have_http_status(:ok) 
    end 

下面是從控制檯

初始用戶的成績單

#<Myapp::V1::System::User id: "13153737-9efb-47e2-8ac9-85aa28befa2b", provider: "email", uid: "[email protected]", name: nil, nickname: nil, image: nil, email: "[email protected]", created_at: "2017-01-13 11:50:01", updated_at: "2017-01-13 11:50:01"> 

更新PARAMS

{"email"=>"[email protected]", "name"=>"Norberto Zulauf", "password"=>"OnT3Zv19YpZ", "password_confirmation"=>"OnT3Zv19YpZ"} 

響應體

"{\"status\":\"success\",\"data\":{\"id\":\"13153737-9efb-47e2-8ac9-85aa28befa2b\",\"email\":\"[email protected]\",\"name\":\"Norberto Zulauf\",\"provider\":\"email\",\"uid\":\"[email protected]\",\"nickname\":null,\"image\":null,\"created_at\":\"2017-01-13T11:50:01.175Z\",\"updated_at\":\"2017-01-13T11:50:03.436Z\"}}" 

請注意,登記控制器(也更新用戶)是重寫,以滿足特定的要求。

添加faker寶石,如果需要嘗試的代碼。請參閱本線程subdomain_login幫手

RSpec: Authenticating before test with devise_auth_token

+0

我試過了。 – Otaffa

相關問題