上篇隨筆裡測試了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的測試。