首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Ruby on Rails 開發從頭來(二十二):登入控制器測試實戰

     編輯:Java 相關知識

LoginController 測試骨架

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]

測試通過,確認錯誤訊息正確顯示。

測試登入成功

Fixtures 定義

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

所有斷言通過,登入流程測試完成。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved