capybaraを使ってhelperメソッドのテストを行う
今回はRuby on Railsのhelperメソッドの単体テストをどうしましょうね、というお話です。 model, controller, viewのテストについてはWeb上に情報が色々と出ているのですが、helperについてはあまり情報が上がってないようなので(自分の検索の仕方が悪いだけかもしれませんが。。。)ここで簡単にまとめとこうと思います。
テスト環境は下記の通りです。
- Ruby 1.9.3
- Ruby on Rails 3.2.3
- RSpec 2.10
- capybara 1.1.2
テストする内容としては、helperメソッドを実行した時にちゃんと思った通りのタグや文字列が出力されてるかどうかという点になるかと思いますが、テストコードでhelperメソッドの返り値を正規表現でゴリゴリとチェックするのは大変面倒です。 helperメソッドの仕様が変わったらテストコードも修正する必要がありますが、正規表現でゴリゴリとチェックするようにしてたらメンテナンスも大変です。やってられません。
そこでcapybaraの出番です。 capybaraではhas_css?メソッドやfindメソッド等、cssセレクタを利用して文字列を解析できるメソッドが提供されています。
capybaraのインストールはGemfileに下記行を追加して、bundle updateコマンドでインストールできます。
gem 'capybara'
bundleコマンド実行後にspec/spec_helper.rbの上の方でrequireしてる部分に下記2行を追加してください。
require 'capybara/rails' require 'capybara/rspec'
ここまで出来たら、テストコードを実装して行きましょう。
RSpecのspecファイル内でhelperメソッド「hoge_tag」を実行するには下記のようにします。
result = helper.hoge_tag(fuga)
helper変数のインスタンスメソッドとしてhelperメソッド「hoge_tag」を実行します。 返り値は普通の文字列ですので、別の変数に代入することもできます。
このままではcapybaraの機能を利用してcssセレクタでhoge_tagの実行結果を検証できないので、
node = Capybara.string(helper.hoge_tag(fuga))
上記のようにしてCapybara::Node::Simpleクラスのインスタンスを生成します。 その後にCapybara::Node::Matchersモジュールで実装されているhas_css?メソッドやfindメソッド等を駆使してhelperメソッドの実行結果を検証していきます。 helperメソッド「hoge_tag」の実行結果がこんな感じだとします。
helper.hoge_tag(fuga)
<!-- hoge_tag(fuga)の実行結果 --> <input class="fuga" type="text" name="hoge">fuga</div>
テストコードはこんな感じになります。
node = Capybara.string(helper.hoge_tag(fuga)) node.tag_name.should == 'input' # inputタグが出力されてるかどうか node.has_css?('.fuga').should be_true # cssでfugaクラスが指定されているかどうか node[:type].should == 'text' # inputタグのtype属性がtextかどうか
詳細は公式ドキュメントをご覧ください。