2010-01-28 49 views
17

我編寫了一個使用機械化來遍歷網站的小程序。如何測試使用機械化的紅寶石應用程序

我想爲它編寫的測試,但不希望它真正去登錄到網站我每次運行測試時間。我想嘲笑互聯網,所以當它進入某個網站時,它只是返回存儲的結果。

這裏是一個小例子,假裝我的代碼的目的是爲了拉動鏈接關閉谷歌主頁的,所以我寫一個測試,以確保第一個鏈接我的代碼發現有文字「圖像」。我可能會寫這樣的事:

require 'rubygems' 
require 'mechanize' 
require 'test/unit' 

def my_code_to_find_links 
    google = WWW::Mechanize.new.get('http://www.google.com') 
    # ... 
    # some code to figure out which liks it wants 
    # ... 
    google.links 
end 

class TestGoogle < Test::Unit::TestCase 
    def test_first_link_is_images 
    assert_equal 'Images' , my_code_to_find_links.first.text 
    end 
end 

如何嘲笑google.com,這樣我可以測試my_code_to_find_links無實際上訪問互聯網所有的開銷?

感謝 -Josh

回答

35

使用Fakeweb存根出來互聯網的反應。

對於谷歌爲例,首先進入該網站,並保存你想要的頁面的HTML。在這種情況下,我們假設您通過瀏覽器或curl保存了www.google.com。將Fakeweb寶石添加到您的測試中。RB文件

然後你的代碼是

stream = File.read("saved_google_page.html") 
FakeWeb.register_uri(:get, 
    "http://www.google.com", 
    :body => stream, 
    :content_type => "text/html") 

當你這樣做的

你的標準機械化通話
agent = Mechanize.New 
page = agent.get("http://www.google.com/") 

Fakeweb將返回你保存的方式設置的CONTENT_TYPE標題的頁面,機械化將認爲它成功地訪問了互聯網。請確保content_type標頭已設置,否則Mechanize會將響應視爲Mechanize :: File而不是Mechanize :: Page。您可以通過拔下網絡連接在機器上運行測試來測試它是否完全正常工作。

p.s.我在回答這個問題後6個月,因爲這是谷歌的最高成績,但沒有答案。我只花了30分鐘搞清楚自己,並認爲我會分享解決方案。

+0

謝謝,這對我有用。下面是一個顯示工作示例的解決方案:http://github.com/JoshCheek/Play/tree/master/mocking-the-internet/ – 2010-07-21 05:13:36

1

如果你正在寫功能測試和服務器並不需要是任何幻想,你可以寫,只是在測試運行一個小的HTTP服務器;測試代碼配置被測代碼以聯繫localhost:上的小型HTTP服務器。

我建議WEBrick。建立一個HTTP服務器很簡單。

2

如果你正在編寫單元測試,那麼你正在尋找棒錯誤的結束,你不需要嘲笑google.com,但你應該嘲笑/存根機械化對象,即。創建機械化對象,使用參數http://www.google.com在對象上調用get方法。是的,您需要通過訪問頁面來測試您正在執行的操作,而您可以輕鬆地通過殘留響應來完成所有測試。因爲如果你使用的是摩卡咖啡,然後

mechanize = stub('WWW::Mechanize') 
WWW::Mechanize.stubs(:new).returns(mechanize) 
mechanize.stubs(:get).with('http://www.google.com').returns('What ever out put you are expecting so that you can test') 

例子,我不認爲你真的需要測試你的請求是否進入google.com或不是因爲已經在機械化寶石測試。

在另一方面,如果你正在做集成/黃瓜測試,那麼你可以使用Sinatra和假冒網站。 Sinatra使編寫單頁腳本並將該腳本作爲網站運行變得非常簡單。

編輯:

如果你不使用的摩卡咖啡,那麼你需要安裝它,要求它在你的測試

sudo gem install mocha 

而且在測試中

require 'rubygems' 
require 'mocha' 
+3

老實說,我認爲這是一個意見問題。考慮到結果對象的複雜性,與FakeWeb等相比,Stubbing機械化將是一個痛苦的過程。你很可能最終會進行非常脆弱/高度的維護測試,這些測試通過將測試結果精確地與實施密切相關。雖然我通常會同意你不應該測試外部依賴 - 我認爲這是該規則的一個例外。 – 2012-08-06 22:19:16