2012-08-15 21 views
1

我正在測試一個可以進行webscraping的模塊。努力在Rspec測試中僞造Web數據

我有這種方法抓取頁面的robots.txt文件。

def download_robots_file(page) 
    Net::HTTP.get(URI("#{page}robots.txt")) 
rescue StandardError => ex 
    log_info('robot_file', ex) 
end 

而且我有這個測試。第一個規範確保該方法可以安全地失敗,第二個測試涵蓋了實際下載頁面時發生的情況。我所做的是從cnn.com下載robots.txt文件並將其存儲在本地。我複製了該文件並切掉了最後一位(「robots.txt」),以便我的方法正常工作。有點奇怪,我承認。我願意以更好的方式去做事情。

describe '#download_robots_file(page)' do 
    it "returns if there's no page" do 
    @dummy.stub(:log_info).and_return("No Robots.txt file exists.") 
    page = '' 
    @dummy.download_robots_file(page).should == "No Robots.txt file exists." 
    end 

    it "returns the robots file if it exists" do 
    page = './spec/data/cnn_' #gotta be better way! 
    robots_file = File.open('./spec/data/cnn_robots.txt', "r") 
    expected_page = robots_file.read 
    @dummy.stub(:log_info) 
    @dummy.download_robots_file(page).should == expected_page 
    end 
end 

我的問題是:

  1. 這是一個很好的策略,用於測試download_robots_file方法是否正常工作?
  2. 如果不是,有什麼更好的方法來做到這一點?
  3. 有沒有比在第一次測試中使用「.and_return」代碼更好的方法?

回答

1

在我看來,你不應該測試Net::HTTP是否工作正常,而應該測試它是否被正確的參數調用。

URI::HTTP.expects(:URI).with("page") 
Net::HTTP.expects(:get) 
@dummy.download_robots_file(page)