0
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 3 years have passed since last update.

【第7章】Railsチュートリアルでエラーメッセージに対するテストが書けなかったので復習した

Posted at

Railsチュートリアル第7章(第6版)-7.3.4.1 演習- でエラーメッセージに対するテストコードの意味が分からず書けなかったので、この機会に復習した。

-エラーメッセージをテストするためのテンプレート-
assert_select 'div#<CSS id for error explanation>'
assert_select 'div.<CSS class for field with error>'

#①assert_selectメソッド
assert_selectメソッドは様々な指定方法がある。このことがすっかり頭から抜け落ちていたので第5章に戻って再確認。

Code マッチするHTML
assert_select "div" <div>foobar</div>
assert_select "div", "foobar" <div>foobar</div>
assert_select "div.nav" <div class="nav">foobar</div>
assert_select "div#profile" <div id="profile">foobar</div>
assert_select "div[name=yo]" <div name="yo">hey</div>
assert_select "a[href=?]", '/', count: 1 <a href="/">foo</a>
assert_select "a[href=?]", '/', text: "foo" <a href="/">foo</a>

assert_select "div.ほげほげ"はclass属性、
assert_select "div#ふがふが"はid属性をマッチさせることが出来る。

#②パーシャル(partial)
今回のエラーメッセージはユーザー登録失敗時に出力される。
ユーザー登録のViewにおいてエラーメッセージのパーシャルを出力するようにしている。

<%= render 'shared/error_messages' %>

ここでは、'shared/error_messages'というパーシャルをrender(描画)している。
renderはRailsヘルパー。

-フォーム送信時にエラーメッセージを表示するためのパーシャル-
<% if @user.errors.any? %>
  <div id="error_explanation">
    <div class="alert alert-danger">
      The form contains <%= pluralize(@user.errors.count, "error") %>.
    </div>
    <ul>
    <% @user.errors.full_messages.each do |msg| %>
      <li><%= msg %></li>
    <% end %>
    </ul>
  </div>
<% end %>

つまりエラーメッセージが出力されたときにマッチするのは、
assert_select "div.alert"
assert_select "div#error_explanation" である。

#まとめ
第5章を復習することで、エラーメッセージに対するテストが書けた。

0
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
0
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?