在很多時候,我們的程序和實際的環境有依存關係,比如現在的購物車,在匯款,結賬的時候要接入網絡上的銀行賬號,這樣就造成了我們測試的時候必須要有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讓這些工作變得簡單。