2016-11-20 60 views
0

我想添加一些自定義字段到用戶註冊,所以我覆蓋了設計註冊控制器。現在我正在嘗試編寫一個應該(我認爲)創建一個新的未註冊用戶的測試。雖然測試失敗,但我不確定要從這裏進行故障排除。如何在重寫設計控制器時測試註冊?

# note: this is a dump of `:valid_attributes` by my test 
{"id"=>nil, "name"=>"Hans Swift", "email"=>"[email protected]", "encrypted_password"=>"$2a$04$T6mRo3Dzcv6iV7Kdh52E6OA0tAX7nE4y3skV2jzkD9CLr5v8Dri1K", "reset_password_token"=>nil, "reset_password_sent_at"=>nil, "remember_created_at"=>nil, "sign_in_count"=>0, "current_sign_in_at"=>nil, "last_sign_in_at"=>nil, "current_sign_in_ip"=>nil, "last_sign_in_ip"=>nil, "confirmation_token"=>nil, "confirmed_at"=>nil, "confirmation_sent_at"=>nil, "unconfirmed_email"=>nil, "failed_attempts"=>0, "unlock_token"=>nil, "locked_at"=>nil, "created_at"=>nil, "updated_at"=>nil} 
F 
Failures: 

    1) Users::RegistrationsController POST #create with valid params creates a new User 
    Failure/Error: 
     expect { 
     puts valid_attributes 
     post :create, {:user => valid_attributes}, valid_session 
     }.to change(User, :count).by(1) 

     expected #count to have changed by 1, but was changed by 0 
    # ./spec/controllers/users/registrations_controller_spec.rb:19:in `block (4 levels) in <top (required)>' 

有誰能提出一個理由,這個測試是無法創建用戶?當我使用users/sign_up表單時,該應用程序正常工作,並且電子郵件到達我的收件箱。

./spec/controllers/users/registrations_controller_spec.rb

require 'rails_helper' 
require 'factory_girl_rails' 

RSpec.describe Users::RegistrationsController, type: :controller do 

    describe "POST #create" do 
    let(:valid_attributes) { FactoryGirl.build(:user_for_registration).attributes } 
    let(:invalid_attributes) { User.get_invalid_user.attributes } 
    let(:valid_session) { {} } 

    # Help Devise map routes from the test back to the original controller. 
    # See http://stackoverflow.com/questions/6659555/how-to-write-controller-tests-when-you-override-devise-registration-controller 
    before :each do 
     request.env['devise.mapping'] = Devise.mappings[:user] 
    end 

    context "with valid params" do 
     it "creates a new User" do 
     expect { 
      puts valid_attributes 
      post :create, {:user => valid_attributes}, valid_session 
     }.to change(User, :count).by(1) 
     end  
    end 

    end 

end 

./app/controllers/users/registrations_controller.rb

class Users::RegistrationsController < Devise::RegistrationsController 
    before_filter :configure_permitted_parameters, if: :devise_controller? 

    protected 

    # we have to explicitly permit params in overridden controllers like this 
    # see https://github.com/plataformatec/devise#strong-parameters 
    def configure_permitted_parameters 
    devise_parameter_sanitizer.permit(:sign_up) do |u| 
     u.permit(:name, :email, :password, :password_confirmation) 
    end 
    devise_parameter_sanitizer.permit(:account_update) do |u| 
     u.permit(:name, :email, :password, :password_confirmation, :current_password) 
    end 
    end 
end 

./spec/factories/users.rb

require 'ffaker' 

FactoryGirl.define do 
    factory :user do |u| 
    @pass = "password" 

    name FFaker::Name.name 
    email { |me| "#{name.to_s.gsub(/\s/,'.')}_#{rand(1000).to_s}@testing.com" } 
    password @pass 

    factory :user_for_registration do 
     password_confirmation @pass 
    end 

    factory :user_for_account_update do 
     password_confirmation @pass 
     current_password @pass 
    end 
    end 
end 
+1

我認爲你通過請求傳遞了錯誤的參數。看起來你應該傳遞':name,:email,:password,:password_confirmation'而不是'encrypted_pa​​ssword'等。我沒有發佈它作爲答案,因爲我不是100%。檢查日誌並查看正在發送的參數。 – DickieBoy

+0

是的,那看起來沒錯。看起來我應該使用'FactoryGirl :: attributes_for(:user)'而不是'FactoryGirl :: build(:user).attributes'。當我改變測試通過。不知道當我開始使用FactoryGirl :: build()..嗯,很高興知道,謝謝! – doub1ejack

+0

由此判斷,'attributes_for'看起來像會在某些過濾器鏈運行後爲您提供屬性。您應該仔細研究一下,並將其作爲答案發布。 – DickieBoy

回答

1

你說你的測試發佈所有這些屬性:

{ 
    "id"=>nil, 
    "name"=>"Hans Swift", 
    "email"=>"[email protected]", 
    "encrypted_password"=>"$2a$04$T6mRo3Dzcv6iV7Kdh52E6OA0tAX7nE4y3skV2jzkD9CLr5v8Dri1K", 
    "reset_password_token"=>nil, 
    "reset_password_sent_at"=>nil, 
    "remember_created_at"=>nil, 
    "sign_in_count"=>0, "current_sign_in_at"=>nil, 
    "last_sign_in_at"=>nil, 
    "current_sign_in_ip"=>nil, 
    "last_sign_in_ip"=>nil, 
    "confirmation_token"=>nil, 
    "confirmed_at"=>nil, 
    "confirmation_sent_at"=>nil, 
    "unconfirmed_email"=>nil, 
    "failed_attempts"=>0, 
    "unlock_token"=>nil, 
    "locked_at"=>nil, 
    "created_at"=>nil, 
    "updated_at"=>nil 
} 

首先,它實際上是POST操作下user鑰匙所有這些,使控制器的PARAMS實際上user[id]user[name]等設計需要它的參數處於頂級水平,如下所示:

post :create, valid_attributes, valid_session 

二,屬性肯定不是您的視圖POST,而您的控制器僅允許name,emailpasswordpassword_confirmation。所以我認爲在解決第一個問題後,您的測試請求仍然會被拒絕。要解決這些問題,請確保您的測試只發布這四個屬性。

下一次,你可以通過運行只是單一的測試(rspec spec/controllers/users/registrations_controller_spec:123其中123是測試的行號),以及看你log/test.log獲取有關測試失敗的很好的提示。

一旦你通過了,我還會寫一些測試來驗證那些參數是必需的。

另外我看到你通過valid_session,我也會刪除它。如果您已經登錄,Devise不會讓您註冊。即使它是空的,包含它仍然看起來很混亂。

+0

真棒,我不知道'log/test.log' - 這是一個巨大的幫助。 – doub1ejack

+0

另外,對於你的第二點問題是我正在傳遞'FactoryGirl :: build(:user).attributes'而不是'FactoryGirl :: attributes_for(:user)',這就是爲什麼我有那麼長的列表(數據庫字段,實際上)而不是我需要的4個字段。 – doub1ejack

相關問題