Ruby: Steak + CapybaraでUser-Agentを設定してテストを行う

思いっきり@kazuhisa1976さんの記事のタイトルをパクっていますが、内容もほぼパクリです(ぇ

[絶対R領域] Cucumber + CapybaraでUserAgentを設定してテストを行う

私が使っている受け入れテストフレームワークはSteakなんですが、個人プロジェクトで初めて使いだしたので正直まだ全然わかっていません。SteakはRspecみたいに受け入れテストが書けるので、プログラマがガリガリとテストを書くにはわかり易いし軽いしいいんじゃないか?ということで仕事でも使うかもしれないので調査がてら採用しているところ。

で、自分が作っているアプリはWebアプリなんですが、ターゲットを最初っからモバイルに限定しています。そして、何の気なしにテストコードを流したらViewがないというエラーで落ちました。そりゃそうだ。PC用のViewを準備してないもの。

そこで、モバイル用のViewを見させるにはどうすりゃいいんだろう?と悩んだのですが、CapybaraのUser-Agentを偽装するんだろうなーと思ってググったら、某R社のスーパーアーキテクトのかずさんブログがヒットしたわけです。すごい。1番上に出てきましたよ!!

SteakでUser-Agentを偽装するのも全く同じ方法でできます。
spec/acceptance/support/helpers.rbの先頭に以下を追加しておきます。

# HTC EVOのUser-Agent
Capybara.register_driver :android do |app|
  Capybara::RackTest::Driver.new(app,
  :headers => {'HTTP_USER_AGENT' => 'Mozilla/5.0 (Linux; U; Android 2.2.1; ja-jp; ISW11HT Build/FRG83) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1'})
end

同様に、setup_useragentメソッドを作っておきました。新たにUser-Agentを追加した場合はここのcase文をいじるなりすればいいのかなと。

module HelperMethods
  def setup_useragent(target)
    case target
    when :android
      Capybara.current_driver = :android
    else
    end
  end
end

で、Steakのコードはこんな感じ。シナリオの先頭でUser-Agentの切替を行ってから、テストを実行しています。

# coding: utf-8
require File.expand_path(File.dirname(__FILE__) + '/acceptance_helper')

feature "サンプルテスト", %q{
  サンプルテストを記述する。
  なぜなら自分が後から見てもわかるようにするからだ。
} do
  background do
    user = FactoryGirl.create(:user)
    3.times { FactoryGirl.create(:list, :user => user)
  end

  scenario "自分の作成したリストを表示する" do
    setup_useragent(:android)
    do_login # HelperMethodsで定義してると仮定
    visit own_list_page
    page.should have_content("リスト1")
    page.should have_content("リスト2")
    page.should have_content("リスト3")
  end
end

Cucumberになれているとちょっと書きにくく感じてしまうのですが、プログラマの感覚で書いていくと直感的に書き易くていいんじゃないかと思いますよ、Steak。
ひとまずこれでモバイルページも怖くない!!(はず)


カテゴリー Ruby, Ruby on Rails | タグ     | パーマリンク

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です