Ruby on rails開發從頭來(windows)(二十三)-功能測試的約定

上篇隨筆裏測試了login_controller,我們使用了很多rails內建的斷言和get,put等方法來進行測試。這次來看看rails在功能測試方面的一些約定。

1.       HTTP請求的方法(HTTP request method)

下面的方法用來模擬HTTP請求並得到一個迴應(response)

get()

put()

post()

delete()

head()

這五個函數每一個都有同樣的四個參數,以get()爲例:

get(action, parameters = nil, session = nil, flash = nil)

向指定的Action發出一個HTTP GET請求,並且設定Response,四個參數的含義分別爲:

action:HTTP請求所指定的某個控制器(controller)的一個Action。

Parameters:可選的Hash,作爲request的參數。

Session:可選的,Session的Hash。

Flash:可選的,flash的Hash。

下面是例子:

get :index

get :add_to_cart, :id => @version_control_book.id

get :add_to_cart, :id => @version_control_book.id,

:session_key => 'session_value', :message => "Success!"

2.       斷言(assertion)

除了有Test:Unit提供的一些基本的斷言(assertion),功能測試還可以在執行請求後使用一些自定義的斷言。例如下面的:

l         assert_response(type, message=nil)

判斷得到的HTTP響應是一個數字型的狀態值或者下面列舉的標記,這些標記覆蓋了HTTP響應值,例如:redirect對應300-399。

:success

:redirect

:missing

:error

例子:

assert_response :success

assert_response 200

l         assert_redirected_to(options = {}, message=nil)

判斷最後一個請求的Action是否被重定向到其他的controller,action或頁面,例如:

assert_redirected_to :controller => 'login'

assert_redirected_to :controller => 'login', :action => 'index'

assert_redirected_to "http://my.host/index.html"

l         assert_template(expected=nil, message=nil)

判斷一個請求是否使用了指定的template來描畫(render)

例如:

assert_template 'store/index'

l         assert_tag(conditions)

判斷在一個響應的body內是否有符合指定條件的tag,條件的參數必須是下面的keys中的一個或多個。

:tag,節點的類型                                          

assert_tag :tag => 'html'

:content,判斷節點的content的值

assert_tag :content => "Pragprog Books Online Store"

:attributes,一組條件,用來判斷節點的屬性

assert_tag :tag => "div", :attributes => { :class => "fieldWithErrors" }

:parent,一組條件,判斷節點的父節點

assert_tag :tag => "head", :parent => { :tag => "html" }

:child,一組條件,判斷當前節點的最近的一個直屬的child

assert_tag :tag => "html", :child => { :tag => "head" }

:ancestor,一組條件,判斷當前節點的最近的一個祖先

assert_tag :tag => "div", :ancestor => { :tag => "html" }

:descendant,一組條件,判斷當前節點的最近的一個子孫

assert_tag :tag => "html", :descendant => { :tag => "div" }

:children,一組條件,判斷節點的children的數量,使用下面的key中的任意一個或一組

  :count,一個數字或一個範圍,指定要match的children的編號。

  :less_than,children的編號必須小於指定的數字。

  :greater_than,children的編號必須大於指定的數字。

  :only,當計算children的數量是使用的一組條件。

  例子:

assert_tag :tag => "ul",:children => { :count => 1..3,:only => { :tag => "li" } }

更多的斷言參考:http://api.rubyonrails.com/classes/Test/Unit/Assertions.html.

3.       變量

當一個請求(request)被執行,可以依靠下面的變量來進行斷言。

l         assigns(key=nil)

由最後一個action賦值的實例變量。

assert_not_nil assigns["items"]

assigns必須被指定一個字符串作爲索引,但是上面的assert_not_nil assigns["items"]卻不會起作用,因爲items是一個關鍵字,可以使用一方法調用來代替:

assert_not_nil assigns(:items)

l         session

session的一個hash對象:

assert_equal 2, session[:cart].items

l         flash

在session裏存放的flash的hash對象

assert_equal "Danger!", flash[:notice]

l         cookies

用戶使用的cookies的hash對象。

assert_equal "Fred", cookies[:name]

l         redirect_to_url

上一個action重定向的完整的url

assert_equal "http://test.host/login", redirect_to_url

 

OK,這次就到這裏,下次繼續會到controller的測試。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章