1

ウェブスクレイピングを行うモジュールをテストしています。

ページのrobots.txtファイルを取得するこのメソッドがあります。

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

そして、私はこのテストを持っています。最初の仕様はメソッドが安全に失敗することを保証し、2番目のテストは実際にダウンロードされるページがあるときに何が起こるかをカバーします。私がやったことは、robots.txtファイルをm cnn.comからダウンロードして、ローカルに保存することです。ファイルをコピーし、最後のビット( "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 に答える