はじめに
Rails標準のテスティングツールはminitest(をベースにRailsが独自拡張したもの)です。
現場ではRSpecがよく使われるとはいえ、Rails標準のminitestを使っている方も中にはおられると思います。
Railsのminitestにはassert
やrefute
(または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 (useActionDispatch::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