6252


特定のページをスクレイピングして解析するスクリプトをRubyで書いているのですが、  
このスクリプトのテストをRSpecで書く時にどこにHTMLファイルを置いて、  
どうspecファイルから呼び出すのが正しいのでしょうか？

Rails環境ではななくフレームワークなしのRubyのコードで以下の様な構成です。

[code]

    foo.rb
    foo/sub_class.rb
    spec/foo_spec.rb
    spec/spec_helper.rb
    spec/foo/sub_class_spec.rb
    
[/code]

### 追記

具体的には`Selenium::WebDriver.for`で生成した `driver` を
`Foo::SubClass`が受け取り、解析をするために`Nokogiri`に `@driver.page_source`で渡しています。

(上では`SubClass`と書いていたのですが、ここでは`Bar`にしてます。)

[code]

    class Foo::Bar
      attr_accessor :driver
      def initialize(code: code, driver: driver)
        @code = code
        @driver = driver
      end
    
      def doc
        Nokogiri::HTML(@driver.page_source)
      end
    end
    
[/code]

ですので、ここで受け取る`@driver.page_source`を`File.read`で保存していたHTMLからの読み込みで差し替えたいのですがうまく行きませんでした。ファイルの読み込み自体はできていますので配置ではなく`allow`の使い方の問題だと思うので、そちらについてはもう少し調べてみます。

ファイルの読み込み方に問題があれば指摘をよろしくお願いします。

[code]

    require 'spec_helper'
    
    describe Foo::Bar do
      let(:bar){ Foo::Bar.new(code: 1, driver: nil) }
      describe "driver#page_source" do
        it "do something" do
          allow(bar.driver).to receive(:page_source){ Nokogiri::HTML(File.read("spec/fixture/bar/sample.html")) }
          expect(bar.driver.page_source).to present
        end
      end
    end
    
[/code]

エラー内容は以下のようになっています。

[code]

    NameError:
           undefined local variable or method `present' for #<RSpec::ExampleGroups::FooBar::DriverPageSource:0x007fc8660444e0>
    
[/code]


CC BY-SA 3.0
2015-02-10T07:08:26.997
6242
2015-02-10T11:20:18.390
2015-02-10T09:19:44.133
3271
3271
question
ruby rspec
RSpecでスクレイピングのテストをする時のHTMLファイルの置き場所


特に正解が決まっているわけではないと思いますが、

[code]

    spec/fixtures/foo.html
    spec/fixtures/foo/sub_class.html
    
[/code]

のようにしてみるのはいかがでしょうか？  
なんとなく用途がわかりやすいような気がします。

ちなみに [Better Specs](http://betterspecs.org/jp/)
も見てみましたが、該当するようなベストプラクティスは見当たりませんでしたね。

> どうspecファイルから呼び出すのが正しいのでしょうか？

foo.rbやsub_class.rbの実装（HTMLをどうやって読み込んでいるか）によって回答が変わってくる気がします。  
可能であればコードを載せてください。

P.S.  
本論からはちょっと外れますが、RSpecを使うプロジェクトのディレクトリ構成についてはこちらの記事も参考になるかもしれません。

[RailsじゃないRspec3環境を構築する方法](http://qiita.com/yusabana/items/db44b81bdddf6ed0e9f5)

### 追記に対する回答

エラーを見るに `expect(bar.driver.page_source).to present` に問題がありそうです。

Railsであれば

[code]

    expect(bar.driver.page_source).to be_present
    
[/code]

と書きますが、Railsプロジェクトではないようなので、

[code]

    expect(bar.driver.page_source).to be_truthy
    
[/code]

と書いてみてください。

エラーの内容が変わったらまた追記をお願いします。


CC BY-SA 3.0
2015-02-10T08:18:38.617
6252
2015-02-10T11:20:18.390
2015-02-10T11:20:18.390
85
85
6242
answer