2013-08-25 14 views
1

我想測試這個測試登入/ signout方法:無法毀壞CURRENT_USER在SIGN_OUT方法功能測試

測試/控制器/ sessions_controller_test.rb

class SessionsControllerTest < ActionController::TestCase 
    fixtures :users 
    include SessionsHelper 

    test "should signin and signout" do 
    get :new 
    assert_response :success 
    post :create, email: users(:alex).email, password: 'qwerty' 
    assert_redirected_to profile_url 
    assert cookies[:remember_token] 
    assert current_user == users(:alex), 'Ooops! Wrong current_user!' 

    delete :destroy 
    assert_redirected_to signin_url 
    debugger 
    assert !cookies[:remember_token] 
=> assert !current_user, 'Ooops! Current_user not nil!' 
    end 
end 

=>cookies[:remember_token]不見了,但current_userusers(:alex),我不明白爲什麼。我有沒有錯過delete :destroy一行?
集成測試正在通過,並且在帶有註銷行爲的瀏覽器中進行現場演出也有訣竅。

從會話控制器和輔助方法:

sessions_controller.rb

def destroy 
    sign_out 
    redirect_to signin_url 
end 

sessions_helper.rb

def current_user=(user) 
    @current_user = user 
end 

def current_user 
    remember_token = User.encrypt(cookies[:remember_token]) 
    @current_user ||= User.find_by(remember_token: remember_token) 
end 

def sign_out 
    cookies.delete(:remember_token) 
    self.current_user = nil 
end 
+0

'User.find_by(remember_token:User.encrypt(nil))'返回什麼? –

+0

'User.find_by(remember_token:User.encrypt(nil))=>無' –

回答

1

我使用Rails比西納特拉不太熟悉,但不應該通過包含在控制器中的方法已經?

SessionsHelper模塊直接包含在測試中意味着您現在有兩個類@current_user和相關的方法 - 控制器類和測試類。

因此,控制器路由上的destroy方法處理其副本,而測試獲取它自己的(它通過共享cookie值從數據庫方便地填充)。控制器的destroy方法不會更改測試對象中的實例變量。

該測試可能不應該直接對current_user值作出斷言,而是依賴於它可以從Web服務器響應中提取的數據。在這個測試中你不應該有include SessionsHelper(在助手的單元測試中它可以)。

+0

如果我沒有這個include,那麼測試不知道'current_user'是什麼。那麼我如何在測試中測試cookie-part和current_user-part? –

+0

@Alex Fedoseev:不需要測試控制器「知道」服務器內部存儲的內容爲current_user變量。測試網站的行爲。例如。退出時,請檢查1)網頁現在打電話給你什麼,2)是否提供您「登錄」或「註銷」,3)您無法訪問私人資源。 –

+1

如果你想測試'current_user'方法,爲'SessionsHelper'模塊創建一個單元測試。即你需要在這裏爲應用程序中的兩層進行兩次測試。 –