3
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

【Rails/minitest】パーシャルを出し分けるビューヘルパーの自動テストを書いてみる

Last updated at Posted at 2022-04-27

はじめに

こんにちは、この記事を書いている現在が夕方なので、お腹が減ってきてしまったk__mです。
この現場では、Railsのプログラムでビューヘルパーの自動テストが書かれていませんでした。
そこで今回、パーシャルを出し分けるヘルパーメソッドの自動テストを書こうとするものの、あまり参考になる記事も見つけられず、少し詰まってしまいました。。。
結局少しずるい方法で乗り越えてしまったのですが、備忘録代わりに記事を書いていきます。

自動テストの概要

今回自動テストを導入したかったのは、パーシャルの出し分けをする役割のビューヘルパーです。
具体的にはこんな感じです。

ApplicationControllerで定義されているインスタンス変数haraheriでパーシャルを出し分けるようにしています。

app/helpers/application_helper.rb
module ApplicationHelper
  def render_partial
    if @is_haraheri
      render(partial: 'shared/haraheri')
    else
      render(partial: 'shared/not-haraheri')  
    end
  end
end

出力したいパーシャルは下の2つです。

app/views/shared/_haraheri.html.erb
<div>
    <% if @shushoku == 'gohan' %>
        ごはん食べる
    <% else %>
        パン食べる
        <% end %>
</div>
app/views/shared/_not-haraheri.html.erb
<div>おなかいっぱい</div>

実際に書いた自動テスト

実際に書いた自動テストのコードはこちらです。

test/helpers/application_helper_test.rb
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>

さいごに

今回はちょっとずるい方法で乗り越えてしまいましたが、わたしが探しきれなかっただけでもっとうまくやる方法がある気がしています。
もし何かいい方法をご存知の方、他にツッコミポイントなどを見つけてしまった方、ぜひ情報をお願いしたいです。
それでは、最後までお読みいただきありがとうございました!

3
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?