Railsアプリのテストにrequest spec + Capybara(RSpec 2.10.0 + Capybara 1.1.2)を使い始めてみた 。Cucumberみたいに客も読めるみたいな文章風の文法ではないけど、単体テストからRSpecで統一できるのでお気軽。「受入テスト」というより「結合テスト」としてはいいかも。
基本的にはこんなふうにテストケースを書きます。
describe 'ユーザー情報' do
it '詳細表示'
vist users_path
click_link '近藤勇'
page.should have_content '近藤勇の詳細情報'
end
end
いつでも回帰テストできる環境を知ってしまうと、もうテスト無しでは不安でコード書けません。
しかしJavaScript、Ajaxを使ったアプリがターゲットの場合は面倒そうだなあ。と思ったら簡単だった。describeメソッドかitメソッドに :js=>true を追加するだけでSeleniumで動いちゃう。
describe 'ユーザー情報', :js => true do
Firefoxが起動してガチャガチャやってくれる。
でもWebSocketなどのPush技術を使って、あるクライアントが送信した情報が直接他の特定のクライアントに飛ぶようなアプリはどうやってテストしたらいいだろう。…、Capybaraのソースを眺めてたら、using_session を使えばいいっぽいことが分かった。異なるセッションでブラウザを複数起動できる。
it 'チャット送信'
# 2つのブラウザで同じページを開く
using_session :user_A do
visit '/chat/001'
end
using_session :user_B do
visit '/chat/001'
end
# メッセージを送信
using_session :user_A do
fill_in '名前', :with => 'おれ'
fill_in 'メッセージ', :with => 'こんにちは。'
click_button '送信'
end
# 相手のブラウザにメッセージが表示される
using_session :user_B do
page.should have_content 'こんにちは。'
end
end
すばらしい。これで安心してWebSocketとかバリバリ使える。