前面我們測試了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讓這些工作變得簡單。