2011-09-30 28 views
3

我控制器如何編寫私有方法RSpec的控制器中使用參數

class ApplicationController < ActionController::Base 
    def index 
    end 

    private 

    def handle_login_sequence 
     username = params[:userName] 
     password = params[:password] 

     cookies[:locale] = params[:locale] 
     remember   = params[:remember] 

     username_locked = User.locked_username?(username) 
     user = User.authenticate(username, password) 

     if user && user.has_portal_access? 
     case user.account_status 
      when AccountStatus::Active 
      flash[:error] = 'login' 
     end 
     end 
    end 

end 

我想寫Rspec的這種私有方法

@controller = ApplicationController.new 
@controller.send(:handle_login_sequence) 

通過上面的代碼,我可以調用handle_login_sequence方法,但我不知道如何通過如下:

params[:userName], params[:password], params[:locale], params[:remember] 
+1

你的規格到目前爲止是什麼樣的? –

+0

當你沒有想到它時,你有一個零對象!你可能期望ActiveRecord :: Base的一個實例。評價爲零時發生錯誤。[] (我給出了打印的方法內部) – vinothini

回答

2

你不應該測試一個公司的私人方法直接。相反,測試使用此方法的控制器操作。

不要忘記關於您的控制器的黑匣子隱喻。

Black Box testing diagram

如果測試私有方法,你就必須重寫測試時,你想改變的只是執行,而不是接口。黑盒測試將幫助您確保在不直接測試私有方法的情況下不會破壞控制器功能。

+0

從您的文章我理解爲不擔心輸入訪問方法而已。這樣對嗎。如果我調用該方法時不發送顯示以下錯誤的參數 如果您沒有預料到它,那麼您有一個無對象!你可能期望ActiveRecord :: Base的一個實例。評估nil時發生錯誤。[] – vinothini

相關問題