はじめに
こんにちは、この記事を書いている現在が夕方なので、お腹が減ってきてしまったk__mです。
この現場では、Railsのプログラムでビューヘルパーの自動テストが書かれていませんでした。
そこで今回、パーシャルを出し分けるヘルパーメソッドの自動テストを書こうとするものの、あまり参考になる記事も見つけられず、少し詰まってしまいました。。。
結局少しずるい方法で乗り越えてしまったのですが、備忘録代わりに記事を書いていきます。
自動テストの概要
今回自動テストを導入したかったのは、パーシャルの出し分けをする役割のビューヘルパーです。
具体的にはこんな感じです。
ApplicationControllerで定義されているインスタンス変数haraheriでパーシャルを出し分けるようにしています。
module ApplicationHelper
def render_partial
if @is_haraheri
render(partial: 'shared/haraheri')
else
render(partial: 'shared/not-haraheri')
end
end
end
出力したいパーシャルは下の2つです。
<div>
<% if @shushoku == 'gohan' %>
ごはん食べる
<% else %>
パン食べる
<% end %>
</div>
<div>おなかいっぱい</div>
実際に書いた自動テスト
実際に書いた自動テストのコードはこちらです。
class ApplicationHelperTest < ActionView::TestCase
test "腹減りの時、1つ目のパーシャルを出力" do
# インスタンス変数をセット
instance_variable_set("@is_haraheri", true)
instance_variable_set("@shushoku", 'gohan')
# メソッド実行
render_partial
# パーシャル1が出力される
assert_template partial: "shared/_haraheri"
end
test "腹いっぱいの時、2つ目のパーシャルを出力" do
# インスタンス変数をセット
instance_variable_set("@is_haraheri", false)
# メソッド実行
render_partial
# パーシャル2が出力される
assert_template partial: "shared/_not-haraheri"
end
end
具体的な説明
# インスタンス変数をセット
instance_variable_set("@is_haraheri", true) # instance_variable_set("代入したいインスタンス変数", 代入したい値
インスタンス変数haraheriに、trueを代入します。
# メソッド実行
render_partial
実行したいヘルパーのメソッドをポンと書くだけで、そのメソッドを実行できます。お手軽です。
# パーシャルを出力
assert_template partial: "shared/_partial1"
指定したパーシャルが出力されているかのアサーションをしています。
partialオプションを付けることで、パーシャルの出力かどうかをみることができるのは便利ですね。
ハマりポイント
「パーシャル全部のアサーションてどうやるの??」で1時間ほど持っていかれました。
最初はRailsの公式ガイド(下にリンクを貼っておきます)を漁り、
# erbファイルを直接取得
file = File.read(Rails.root.join('app', 'views', 'shared', '_partial.html.erb'))
# アサーション
assert_dom_equal(file, render_partial)
を使おうとしましたが、erbファイルのrubyのコード(<% %>で囲った部分)の処理がうまくいかず、断念しました。
fileの中には<% %>がそのまま残る一方、render_partialを通って出力されたファイルからは<% %>が消えるからです(よく考えたら当たり前。。。)。
その後七転八倒した挙句、今の形に落ち着きました。
注意点
assert_templateですが、Rails4くらいまでは標準で使えたのに、Rails5以降でgemに切り離されてしまったテストヘルパーです。今でも下記リンクのgemを導入すれば使えますが、いかんせんこのgem、作られたのもだいぶ昔な上に、メンテナンスもほぼされていません。
今回書いた自動テストは、1ヶ月程度で消す一時的なものなのでこのgemを使うことにしましたが、本当に使うかどうかは場合に応じて考えてください。
例えば、下のような簡単なhtmlタグを出し分けるヘルパーをテストしたいなら、上でリンクを貼った公式ドキュメントに書いてある方法を使うのが確実だと思います。
<a href="haraheri">はらへり</a>
さいごに
今回はちょっとずるい方法で乗り越えてしまいましたが、わたしが探しきれなかっただけでもっとうまくやる方法がある気がしています。
もし何かいい方法をご存知の方、他にツッコミポイントなどを見つけてしまった方、ぜひ情報をお願いしたいです。
それでは、最後までお読みいただきありがとうございました!