2011-05-19 103 views
0

我創建用戶的方法在users_controller.rb看起來像創建一個測試:Rspec的控制器測試,嘗試以「processlogin」行動

def process_login 
    is_login_valid(params[:user][:user_name], params[:user][:password]) 

    if logged_in? 
     redirect_to root_url 
    else 
     @user = User.new(params[:user][:user_name] 
     redirect_to :action => 'login' 
end 

我有什麼當前:

describe UsersController do 
    describe "Post 'process_login'" 
    it "should be successful" do 
     post 'process_login' 

     response.should be_success 
    end 
    end 

end 

的方法is_login_valid和logged_in?都包含在application_controller中,並且是來自我的/ lib文件夾中的一個ruby類的方法,名爲LoginSystem.rb

我的測試失敗了,因爲它沒有正確地嘲弄事情,這是我第一次這樣做希望有人能幫助我。

錯誤消息:

UsersController POST 'process_login' should be successful 
    Failure/Error: post 'process_login' 
    NoMethodError: 
     You have a nil object when you didn't expect it! 
     You might have expected an instance of ActiveRecord::Base. 
     The error occurred while evaluating nil.[] 
    # ./app/controllers/users_controller.rb:11:in `process_login' 
    # ./spec/controllers/users_controller_spec.rb:21 
+0

你的問題是什麼? – 2011-05-19 17:11:36

+0

我更新了q,我需要測試通過。 – Blankman 2011-05-19 17:12:37

+0

如果您提供錯誤消息,它可能會有所幫助。 – 2011-05-19 17:13:45

回答

2

啊,感謝您的錯誤消息。我假設第11行是is_login_valid(params[:user][:user_name], params[:user][:password])。因爲你沒有發送任何參數在你的測試後params [:user]是零因此爲零。[]錯誤(當控制器正在尋找參數[:user] [:user_name])時,你設置了通過將它們作爲第二個參數作爲散列傳遞給測試中的參數。

+0

啊,所以我要爲此創建一個存根或只傳入一個虛擬散列?這個怎麼做? – Blankman 2011-05-19 17:37:53

+0

好吧,這解決了散列問題,現在它似乎是重定向到頁面,如果登錄失敗,即使我有seeting logged_in?爲真。 – Blankman 2011-05-19 17:56:14

+0

好的我在'帖子'後面有存根,但它必須被剝掉b4。謝謝克里斯! – Blankman 2011-05-19 18:02:44

0

我相信:你想要去的,如果我理解正確

controller.stub(:is_login_valid} { true } 

應該得到你。

1

我覺得你確實需要

controller.stub(:logged_in?) { true } 

或者,如果你想測試的LOGGED_IN方法實際上是被稱爲

controller.should_receive(:logged_in?).and_return(true) 

第2版本將導致測試失敗,除非方法logged_in?被稱爲一次且僅一次

如果您收到錯誤消息,您可能還需要@jaydel建議的controller.stub(:is_login_valid} { true }有關此方法的消息也丟失了