程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> Ruby on rails開發從頭來(windows)(二十五)-測試Controller

Ruby on rails開發從頭來(windows)(二十五)-測試Controller

編輯:關於JAVA

這次我們繼續測試Controller,還是Store_controller。

1.先來測試測試CheckOut功能,給store_controller_test.rb添加代碼:

def test_checkout
test_add_to_cart
get :checkout
assert_response :success
assert_not_nil assigns(:order)
assert_template "store/checkout"
end

注意這裡調用了另一個test方法test_add_to_cart,因為如果購物車為空的話,我們將無法轉到預想的checkout頁面去,所以我們必須讓購物車(cart)裡至少有一件商品(item)。所以我們沒有寫重復代碼,而是調用了test_add_to_cart方法來使購物車中有商品。

2.再來測試保存訂單功能,我們通過save_order的Action來將保存order,我們的辦法就是:cart將items存放到order的model裡,然後由order保存到數據庫,然後將cart置空,再重新定位到購物的store頁面,並且顯示一個友好的消息。現在在store_controller_test.rb添加代碼:

def test_save_invalid_order
test_add_to_cart
post :save_order, :order => {:name => 'fred', :email => nil}
assert_response :success
assert_template "store/checkout"
assert_tag :tag => "div", :attributes => { :class => "fieldWithErrors" }
assert_equal 1, session[:cart].items.size
end

上面是先測試無效的order,我們通過給save_order的Action一個無效的order,當無效的order被提交的時候,我們使用assert_tag來檢查響應的div節點的是否是fieldWithErrors類型。

3.下面我們再來測試一個有效的order的保存。

def test_save_valid_order
test_add_to_cart
assert_equal 1, session[:cart].items.size
assert_equal 1, Order.count
post :save_order, :order => @valid_order_for_fred.attributes
assert_redirected_to :action => 'index'
assert_equal "Thank you for your order.", flash[:notice]
follow_redirect
assert_template "store/index"
assert_equal 0, session[:cart].items.size
assert_equal 2, Order.find_all.size
end

運行測試,提示有斷言失敗,仔細看看,原來是assert_equal 1, Order.count這一句,是因為我們還沒有邊界order的fixtrue,現在轉到fixtrues目錄下,修改orders.yml文件:

valid_order_for_fred:

id: 1

name: Fred

email: [email protected]

address: 123 Rockpile Circle

pay_type: check

再運行測試,這次提示的錯誤(error),原來是@valid_order_for_fred.attributes的問題,這是老問題了,為了不影響我們繼續,在test_add_to_cart後面添加一句,@valid_order_for_fred = Order.find(1),OK,再次運行測試,還有錯誤!看看命令行的輸出:

-------------------------------------------------

1) Failure:

test_save_valid_order(StoreControllerTest) [test/functional/store_controller_test.rb:75]:

<"Thank you for your order."> expected but was

<"Thank you for your order">.

6 tests, 32 assertions, 1 failures, 0 errors

_________________________________________________

看來是flash中設置的文本有問題,少了一個句號,我們回過頭,修改store_controller.rb中的save_order方法,給flash的文本後面添加一個句號,然後再執行測試,OK,這次全部通過了。

4.如果我們現在回到數據庫裡看看order表,會發現有兩條一模一樣的記錄,僅僅是id不同而已。這是因為測試在執行時,加載order的測試fixtrue時向數據庫中添加了一跳id為1的order,然後我們在執行save_valid_order時又向其中添加了一條order。我們可以通過查看Log目錄下的test.log文件來查看Action的調用情況和執行的sql的情況。

自己通過查看log,只發現了測試用例調用save_order的Action的一次Insert操作,但是雖然直覺上order的fixtrue加載時也應該有log,但是並沒有找到。

好了,目前我們寫了一些簡單的測試,包括Model的,Controller的,但是真正的測試還不止這些,後面我們再學習一些進階內容。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved