capybaraを使ってhelperメソッドのテストを行う

今回はRuby on Railsのhelperメソッド単体テストをどうしましょうね、というお話です。 model, controller, viewのテストについてはWeb上に情報が色々と出ているのですが、helperについてはあまり情報が上がってないようなので(自分の検索の仕方が悪いだけかもしれませんが。。。)ここで簡単にまとめとこうと思います。

テスト環境は下記の通りです。

テストする内容としては、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かどうか

詳細は公式ドキュメントをご覧ください。