Cucumberで静的ファイルのチェック

Railsアプリケーションに Cucumber/Webrat/RSpec(-Rails) を入れて統合テストを書いている。
しかし、public/ ディレクトリに入れている様な静的コンテンツのチェックが出来ない、visit はコントローラを呼んでいる。レンダー経由ならチェック出来ると言う事だが、そんな場合ではない。public/index.html のテストがしたい。

Nokogiri(とopen-url)で見に行く

無理矢理だが直接見行くことにする。

Given /^Nokogiriでポート"(\d*?)"の"(.*?)"を見る$/ do |port, path|
  require 'open-uri'
  @nokogiri_saw = Nokogiri::HTML open("http://localhost:#{port}#{path}")
end # Given /^Nokogiriでポート"(\d*?)"の"(.*?)"を見る$/ do |port, path|

「require 'open-uri'」を書くのはここじゃないような気もするが、別にここでもいいよね。Cucumberを使う時点で Nokogiriは使えるようになっている。

Then /^Nokogiriで"(.*?)"とある$/ do |phrase|
  @nokogiri_saw.text.should match(Regexp.new(phrase))
end # Then /^Nokogiriで"(.*?)"とある$/ do |phrase|

Then /^Nokogiriで'(.*?)'とある$/ do |phrase|
  @nokogiri_saw.text.should be_include(phrase)
end # Then /^Nokogiriで'(.*?)'とある$/ do |phrase|

Then /^Nokogiriで"(.*?)"へのリンクがある$/ do |link|
  @nokogiri_saw.search('a').select{ |a| a['href'] == link }.should_not be_empty
end # Then /^Nokogiriで"(.*?)"へのリンクがある$/ do |link|

コンテンツ確認の「""」「''」の別は正規表現マッチにするか単純な部分文字列検索にするかどうか、正規表現だけだとエスケープとか見難くなる事もあるので。Nokogiriの使い方はこんなもんで良いのかな。それからコンテンツ自体の受け渡しにはインスタンス変数を使ったけど、別に定義してローカル変数を使うのも良いかも知れない。
これでシナリオはこんな感じ

    もし Nokogiriでポート"3000""/"を見る
    ならば Nokogiri"Welcome aboard"とある
    かつ Nokogiri"./entries"へのリンクがある

これでは別に script/server を実行してないとならない。

テスト環境での script/server の起動

シナリオの中で script/server を書こう、そしてそれは development環境ではなくて test環境であるべき様な気もする。後片付けも。

Given /^テスト環境をポート"(\d*?)"で起動する$/ do |port|
  puts `script/server -e test -p #{port} -d`
  sleep 1
end # Given /^テスト環境をポート"(\d*?)"で起動する$/ do |port|

Then /^テスト環境の mongrel を停止する$/ do
  puts `mongrel_rails stop -P tmp/pids/mongrel.pid`
end # Then /^テスト環境の mongrel を停止する$/ do

script/server の起動にちょっと時間掛かるっぽいので sleepしてみたり。
で、

フィーチャ: 入り口とか
  入り口とか

  シナリオ: 入り口
    前提 テスト環境をポート"3010"で起動する
    もし Nokogiriでポート"3010""/"を見る
    ならば Nokogiri"Welcome aboard"とある
    かつ Nokogiri"./entries"へのリンクがある
    ならば テスト環境の mongrel を停止する

こんな感じで。

  シナリオ: 入り口                                            # features/welcome_aboard.feature:4
=> Booting Mongrel (use 'script/server webrick' to force WEBrick)
=> Rails 2.2.2 application starting on http://0.0.0.0:3010
    前提 テスト環境をポート"3010"で起動する                            # features/step_definitions/entry_steps.rb:37
    もし Nokogiriでポート"3010""/"を見る                       # features/step_definitions/entry_steps.rb:32
    ならば Nokogiri"Welcome aboard"とある                   # features/step_definitions/entry_steps.rb:79
    かつ Nokogiri"./entries"へのリンクがある                    # features/step_definitions/entry_steps.rb:88
Sending TERM to Mongrel at PID 30010...Done.
    ならば テスト環境の mongrel を停止する                           # features/step_definitions/entry_steps.rb:42