Ruby on rails開發從頭來(windows)(二十六)- 使用Mock對象

前面我們測試了model和controller,學習了一些常用的測試方法,現在我們來深入學習幾個有關測試的主題。第一個是使用Mock對象。

在很多時候,我們的程序和實際的環境有依存關係,比如現在的購物車,在匯款,結賬的時候要接入網絡上的銀行賬號,這樣就造成了我們測試的時候必須要有internet環境。比如,我們在model目錄裏創建了一個payment_gateway.rb來處理網絡銀行相關的操作,我們在store_control.rb的save_order方法裏這樣寫:

gateway = PaymentGateway.new

  response = gateway.collect(:login => 'username',

    :password => 'password',

    :amount => cart.total_price,

    :card_number => @order.card_number,

    :expiration => @order.card_expiration,

    :name => @order.name)

我們在gateway的collect方法中使用銀行賬號的用戶名,密碼等信息,但是這樣一來,我們在測試的時候必須具有真實的internet環境,並且,我們不想在每次運行測試的時候都真正得去操作銀行賬戶。

所以,我們需要的是一個假對象(mock)或PaymentGateway的一個替代品,在這裏,rails爲我們提供了方便,我們所要做的就是在test/mock/test/目錄下創建一個payment_gateway.rb文件,用來覆蓋app/models目錄下的payment_gateway.rb,要注意,這兩處的文件名必須完全一致。Mock文件的內容:

require 'models/payment_gateway'

class PaymentGateway

  def collect(request)

    # I'm a mocked out method

    :success

  end

end

這意味着我們用mock對象替代了真實的models目錄下的PaymentGateway,而collect方法也返回一個假的響應。

在測試的時候,Rails會先到mock對象所在的目錄查找,這樣,加載的就是mock目錄下的類,而不是真實的models目錄下的類。

這樣,通過使用mock對象,我們可以將精力放在重要的,優先級高的測試上,rails讓這些工作變得簡單。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章