require File.dirname(__FILE__) + '/../test_helper'
require 'login_controller'
class LoginController; def rescue_action(e) raise e end; end
class LoginControllerTest < Test::Unit::TestCase
def setup
@controller = LoginController.new
@request = ActionController::TestRequest.new
@response = ActionController::TestResponse.new
end
# ...
end
應用程式在 ApplicationController 定義 authorize 過濾器:
before_filter :authorize, :except => :login
def authorize
unless session[:user_id]
flash[:notice] = "Please log in"
redirect_to :controller => "login", :action => "login"
end
end
def test_index_without_user
get :index
assert_redirected_to :action => "login"
assert_equal "Please log in", flash[:notice]
end
執行通過,驗證未登入用戶正確導向登入頁並設定提示。
登入動作處理 POST 請求:
def login
if request.get?
session[:user_id] = nil
@user = User.new
else
@user = User.new(params[:user])
logged_in_user = @user.try_to_login
if logged_in_user
session[:user_id] = logged_in_user.id
redirect_to :action => "index"
else
flash[:notice] = "Invalid user/password combination"
end
end
end
def test_login_with_invalid_user
post :login, :user => { :name => 'fred', :password => 'opensesame' }
assert_response :success
assert_equal "Invalid user/password combination", flash[:notice]
測試通過,確認錯誤訊息正確顯示。
test/fixtures/users.yml:
fred:
id: 1
name: fred
hashed_password: <%= Digest::SHA1.hexdigest('abracadabra') %>
測試類別宣告 fixtures :users。
def test_login_with_valid_user
post :login, :user => { :name => 'fred', :password => 'abracadabra' }
assert_redirected_to :action => "index"
assert_not_nil session[:user_id]
user = User.find(session[:user_id])
assert_equal 'fred', user.name
end
驗證:導向首頁、Session 寫入 user_id、資料庫可查詢到對應用戶。
# user.rb
def self.login(name, password)
hashed = hash_password(password || "")
find(:first, :conditions => ["name = ? AND hashed_password = ?", name, hashed])
end
def try_to_login
User.login(self.name, self.password)
end
private
def self.hash_password(password)
Digest::SHA1.hexdigest(password)
end
使用 SHA1 雜湊儲存密碼,登入時比對雜湊值。
Loaded suite test/functional/login_controller_test
Started ...
Finished in 0.125 seconds.
3 tests, 8 assertions, 0 failures, 0 errors
所有斷言通過,登入流程測試完成。