這次我們繼續測試Controller,還是Store_controller。
1.先來測試測試CheckOut功能,給store_controller_test.rb添加代碼:
def test_checkouttest_add_to_cartget :checkoutassert_response :successassert_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_ordertest_add_to_cartpost :save_order, :order => {:name => 'fred', :email => nil}assert_response :successassert_template "store/checkout"assert_tag :tag => "div", :attributes => { :class => "fieldWithErrors" }assert_equal 1, session[:cart].items.sizeend
上面是先測試無效的order,我們通過給save_order的Action一個無效的order,當無效的order被提交的時候,我們使用assert_tag來檢查響應的div節點的是否是fieldWithErrors類型。
3.下面我們再來測試一個有效order的儲存。
def test_save_valid_ordertest_add_to_cartassert_equal 1, session[:cart].items.sizeassert_equal 1, Order.countpost :save_order, :order => @valid_order_for_fred.attributesassert_redirected_to :action => 'index'assert_equal "Thank you for your order.", flash[:notice]follow_redirectassert_template "store/index"assert_equal 0, session[:cart].items.sizeassert_equal 2, Order.find_all.sizeend