思いっきり@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。
ひとまずこれでモバイルページも怖くない!!(はず)