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

Gitについて

そろそろ Git。まあ、Railsの後ろでプラグインの辺りでいろいろ動いてる筈だが。そういうわけでなんだかよく分からないのでちょっとメモ

  • リポジトリはどこに
  • そのあと「git add <ディレクトリやファイルの指定沢山>」してから「git commit」その際コメント。
    • 初回は「git add .」として全ファイルを指定
    • その後の処理では「git commit -a」として add を同時進行させても良い
  • 「git diff --cashed」「git diff」「git status」で変更状況を確認
  • 「git log」で履歴、それで出てくるコミットのキーで「git show <その値のはじめの方>」で詳細
  • 適当なところに .gitignore を作って無視するものをリストアップ、書式はまあそれっぽく書く
    • このファイルも git に add するなら add する
    • git に加えたくない無視情報は .git/info/exclude とか

取り敢えず一人でローカルで使う分にはこれ位把握してれば良いのだろうか。どうなんだろう。

その .gitignore

はこんな感じ

*.swp
config/database.yml
log/*.log
tmp/*
vendor/plugins/*

「*.swp」は vi編集中避け(全角半角注意)。vendor/plugins/* も避ける、プラグインは別途 github だし。
最初のコミットまで、diff とか log とか status 出来ないのね。そして最初のコミットのコメント入力画面で追加のファイルの一覧。ignore そうなってるよね。そして、.gitignoreファイルも新規追加になってる。