LoginSignup
19
14

More than 1 year has passed since last update.

minitestでRailsをテストする際に使える検証メソッドの一覧と、そのメソッドに対応するAPIドキュメントのまとめ

Last updated at Posted at 2022-09-11

はじめに

Rails標準のテスティングツールはminitest(をベースにRailsが独自拡張したもの)です。

現場ではRSpecがよく使われるとはいえ、Rails標準のminitestを使っている方も中にはおられると思います。

Railsのminitestにはassertrefute(またはassert_not)で始まる検証メソッドが数多く定義されていますが、かなり数が多いため全メソッドを把握している方は少ないのではないでしょうか。

また、それら検証メソッドは、

  • minitestがデフォルトで提供しているもの
  • Railsが独自に提供しているもの
  • Capybaraのような外部gemが提供しているもの

など様々です。そのため、メソッドの使い方を調べたくてもどのドキュメントで解説されているのかわからない、ということがよくあります。

そこでこの記事では、Railsのminitestではどんなメソッドが使えて、そのメソッドの使い方を調べたいときはどのドキュメントを見にいけばいいのかを一覧化してみました。

minitestでRailsのテストを書く際に「このテストではどんなメソッドが使えるの?」「このメソッドの使い方はどのAPIドキュメントに載っているの?」と思ったときに、この記事を参考にしてみてください。

対象のバージョン

この記事では以下のバージョンを対象にしています。バージョンが変わると使えるメソッドが変わることがあるので注意してください。

  • rails 7.0.2.3
  • minitest 5.15.0
  • capybara 3.36.0
  • rails-dom-testing 2.0.3
  • turbo-rails 1.0.1

Railsの全テストクラスで使えるメソッド

Railsで使うテストクラスはすべてActiveSupport::TestCaseとMinitest::Testを継承しています。そのため、以下で紹介する検証メソッドはモデルのテストやシステムテストなど、テストの種類を問わず、全テストクラスで使えます。

minitest標準の検証メソッド

以下のメソッドはRailsの全テストクラスで使えます。
refuteで始まるメソッドはassertで始まるメソッドの否定形です(〜ではないことを満たせばパス)。

assert系 refute系
assert refute
assert_empty refute_empty
assert_equal refute_equal
assert_in_delta refute_in_delta
assert_in_epsilon refute_in_epsilon
assert_includes refute_includes
assert_instance_of refute_instance_of
assert_kind_of refute_kind_of
assert_match refute_match
assert_nil refute_nil
assert_operator refute_operator
assert_output
assert_path_exists refute_path_exists
assert_predicate refute_predicate
assert_raises
assert_respond_to refute_respond_to
assert_same refute_same
assert_send
assert_silent
assert_throws

各メソッドの使い方はminitestのAPIドキュメントを参照してください。

ActiveSupport::TestCase で追加される検証メソッド

以下のメソッドはRailsの全テストクラスで使えます。
assert_not(またはassert_no)で始まるメソッドはassertで始まるメソッドの否定形です(〜ではないことを満たせばパス)。

assert系 assert_not系
assert_changes assert_no_changes
assert_deprecated assert_not_deprecated
assert_difference assert_no_difference
assert_not
assert_nothing_raised

各メソッドの使い方はRailsのAPIドキュメントを参照してください。

turbo-rails gemを使用している場合は以下のメソッドも追加されます。

assert系 assert_no系
assert_turbo_stream assert_no_turbo_stream

このメソッドの使い方はturbo-rails gemのAPIドキュメントを参照してください。

ActiveSupport::TestCase で追加されるエイリアスメソッド

refuteで始まるminitest標準のメソッドは、Railsではassert_not(またはassert_no)で始まるメソッド名でも提供されています(エイリアスメソッド)。

エイリアス オリジナル
assert_no_match refute_match
assert_not_empty refute_empty
assert_not_equal refute_equal
assert_not_in_delta refute_in_delta
assert_not_in_epsilon refute_in_epsilon
assert_not_includes refute_includes
assert_not_instance_of refute_instance_of
assert_not_kind_of refute_kind_of
assert_not_nil refute_nil
assert_not_operator refute_operator
assert_not_predicate refute_predicate
assert_not_respond_to refute_respond_to
assert_not_same refute_same

minitestのassert_raisesメソッドはRailsでassert_raiseという名前でも提供されています(エイリアスメソッド)。

エイリアス オリジナル
assert_raise assert_raises

各メソッドの使い方はminitestのAPIドキュメントを参照(refuteで始まるオリジナルのメソッド名で検索)してください。

特定のテストでのみ使える検証メソッド

以下で紹介する検証メソッドは、特定のテストでのみ使えるメソッドです。

ActionDispatch::SystemTestCase (ApplicationSystemTestCase) で追加される検証メソッド

以下のメソッドはシステムテストで使えます。

assert系 assert_not系 refute系
assert_all_of_selectors
assert_ancestor assert_no_ancestor refute_ancestor
assert_any_of_selectors
assert_button assert_no_button refute_button
assert_checked_field assert_no_checked_field refute_checked_field
assert_content assert_no_content refute_content
assert_css assert_no_css refute_css
assert_current_path assert_no_current_path refute_current_path
assert_field assert_no_field refute_field
assert_link assert_no_link refute_link
assert_matches_css assert_not_matches_css refute_matches_css
assert_matches_selector assert_not_matches_selector refute_matches_selector
assert_matches_style
assert_matches_xpath assert_not_matches_xpath refute_matches_xpath
assert_none_of_selectors
assert_select assert_no_select refute_select
assert_selector assert_no_selector refute_selector
assert_sibling assert_no_sibling refute_sibling
assert_table assert_no_table refute_table
assert_text assert_no_text refute_text
assert_title assert_no_title refute_title
assert_unchecked_field assert_no_unchecked_field refute_unchecked_field
assert_xpath assert_no_xpath refute_xpath

これらのメソッドはCapybara gemによって提供されています。
各メソッドの使い方はCapybara gemのAPIドキュメントを参照してください。

ActionDispatch::IntegrationTest で追加される検証メソッド

以下のメソッドは統合テスト(IntegrationTest)やコントローラテストで使えます。

assert系 assert_no系
assert_emails assert_no_emails
assert_enqueued_email_with
assert_enqueued_emails assert_no_enqueued_emails
assert_enqueued_jobs assert_no_enqueued_jobs
assert_enqueued_with
assert_generates
assert_performed_jobs assert_no_performed_jobs
assert_performed_with
assert_recognizes
assert_redirected_to
assert_response
assert_routing

各メソッドの使い方はRailsのAPIドキュメントを参照してください。

以下のメソッドはrails-dom-testing gem経由で追加されます。

assert系 assert_not系
assert_dom_equal assert_dom_not_equal
assert_select
assert_select_email
assert_select_encoded

各メソッドの使い方はrails-dom-testing gemのAPIドキュメントを参照してください。

なお、コントローラをテストする場合はActionController::TestCaseクラスを継承する方法もありますが、この方法は推奨されないようです。

Use integration style controller tests over functional style controller tests.
Rails discourages the use of functional tests in favor of integration tests (use ActionDispatch::IntegrationTest).

(筆者訳)
機能的スタイルのコントローラテストよりも統合的スタイルのコントローラテストを使ってください。
Railsとしては機能的テストを避け、統合的テスト( ActionDispatch::IntegrationTest を使用するテスト)を推奨します。

https://api.rubyonrails.org/classes/ActionController/TestCase.html

ActiveJob::TestCase で追加される検証メソッド

以下のメソッドはジョブのテストで使えます。

assert系 assert_no系
assert_enqueued_jobs assert_no_enqueued_jobs
assert_enqueued_with
assert_performed_jobs assert_no_performed_jobs
assert_performed_with

各メソッドの使い方はRailsのAPIドキュメントを参照してください。

ActionMailer::TestCase で追加される検証メソッド

以下のメソッドはメーラーのテストで使えます。

assert系 assert_no系
assert_emails assert_no_emails
assert_enqueued_email_with
assert_enqueued_emails assert_no_enqueued_emails
assert_enqueued_jobs assert_no_enqueued_jobs
assert_enqueued_with
assert_performed_jobs assert_no_performed_jobs
assert_performed_with

各メソッドの使い方はRailsのAPIドキュメントを参照してください。

以下のメソッドはrails-dom-testing gem経由で追加されます。

assert系 assert_not系
assert_dom_equal assert_dom_not_equal
assert_select
assert_select_email
assert_select_encoded

各メソッドの使い方はrails-dom-testing gemのAPIドキュメントを参照してください。

ActionView::TestCase で追加される検証メソッド

以下のメソッドはヘルパーのテストで使えます。

  • assert_generates
  • assert_recognizes
  • assert_redirected_to
  • assert_response
  • assert_routing

各メソッドの使い方はRailsのAPIドキュメントを参照してください。

以下のメソッドはrails-dom-testing gem経由で追加されます。

assert系 assert_not系
assert_dom_equal assert_dom_not_equal
assert_select
assert_select_email
assert_select_encoded

各メソッドの使い方はrails-dom-testing gemのAPIドキュメントを参照してください。

ActionCable::Connection::TestCase で追加される検証メソッド

以下のメソッドはコネクションのテストで使えます。

  • assert_reject_connection

各メソッドの使い方はRailsのAPIドキュメントを参照してください。

ActionCable::Channel::TestCase で追加される検証メソッド

以下のメソッドはチャンネルのテストで使えます。

assert系 assert_no系
assert_broadcast_on
assert_broadcasts assert_no_broadcasts
assert_has_stream
assert_has_stream_for
assert_no_streams

各メソッドの使い方はRailsのAPIドキュメントを参照してください。

おまけ

こんなスクリプトを書いて検証メソッドの一覧を抜き出しました。

require "test_helper"

class UserTest < ActiveSupport::TestCase
  test "list methods" do
    target_methods = methods.grep(/^(?:assert_?|refute_?)/).sort
    target_methods.each do |m_name|
      m = method(m_name)
      if m.owner.to_s.start_with?('Minitest')
        puts "`#{m_name}` (minitest)"
      else
        if m.original_name != m_name
          puts "`#{m_name}` (`#{m.original_name}`)" # alias method
        else
          puts "`#{m_name}`"
        end
      end
    end
    assert true
  end
end
require 'application_system_test_case'

class BlogsTest < ApplicationSystemTestCase
  test "list methods" do
    all_methods = methods.grep(/^(?:assert_?|refute_?)/).sort
    defaults = [:assert, :assert_changes, :assert_deprecated, :assert_difference, :assert_empty, :assert_equal, :assert_in_delta, :assert_in_epsilon, :assert_includes, :assert_instance_of, :assert_kind_of, :assert_match, :assert_nil, :assert_no_changes, :assert_no_difference, :assert_no_match, :assert_no_turbo_stream, :assert_not, :assert_not_deprecated, :assert_not_empty, :assert_not_equal, :assert_not_in_delta, :assert_not_in_epsilon, :assert_not_includes, :assert_not_instance_of, :assert_not_kind_of, :assert_not_nil, :assert_not_operator, :assert_not_predicate, :assert_not_respond_to, :assert_not_same, :assert_nothing_raised, :assert_operator, :assert_output, :assert_path_exists, :assert_predicate, :assert_raise, :assert_raises, :assert_respond_to, :assert_same, :assert_send, :assert_silent, :assert_throws, :assert_turbo_stream, :assertions, :assertions=, :refute, :refute_empty, :refute_equal, :refute_in_delta, :refute_in_epsilon, :refute_includes, :refute_instance_of, :refute_kind_of, :refute_match, :refute_nil, :refute_operator, :refute_path_exists, :refute_predicate, :refute_respond_to, :refute_same]
    target_methods = all_methods - defaults
    target_methods.each do |m|
      puts "`#{m}`"
    end
    assert true
  end
end
19
14
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
19
14