1

我正在测试一个进行网页抓取的模块。

我有这种方法可以获取页面的 robots.txt 文件。

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

我有这个测试。第一个规范确保该方法可以安全地失败,第二个测试涵盖了当实际有一个页面要下载时会发生什么。我所做的是从 m 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”代码更好的方法?
4

3 回答 3

3

我使用FakeWebgem 来存根调用Net::HTTP- 也适用于模拟带有预期响应主体的 HTTP 请求。

https://github.com/chrisk/fakeweb/

于 2012-08-15T21:19:14.790 回答
2

另一种选择是使用 webmock。

https://github.com/bblimke/webmock/

一旦您查看 webmock 或 fakeweb,您的所有 3 个问题都会得到解答

于 2012-08-16T02:57:17.343 回答
1

在我看来,您不应该测试是否Net::HTTP正常工作,而应该只测试它是否使用正确的参数调用。

URI::HTTP.expects(:URI).with("page")
Net::HTTP.expects(:get)
@dummy.download_robots_file(page)
于 2012-08-15T20:56:01.413 回答