2012-08-15 46 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)