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

## はじめに

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ドキュメントを参照してください。

https://docs.seattlerb.org/minitest/

### 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ドキュメントを参照してください。

https://api.rubyonrails.org/

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

|assert系|assert_no系|
|---|---|
| `assert_turbo_stream` | `assert_no_turbo_stream` |

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

https://www.rubydoc.info/gems/turbo-rails/

### 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`で始まるオリジナルのメソッド名で検索）してください。

https://docs.seattlerb.org/minitest/

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

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

### 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ドキュメントを参照してください。

https://www.rubydoc.info/gems/capybara/Capybara

### 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ドキュメントを参照してください。

https://api.rubyonrails.org/

以下のメソッドは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ドキュメントを参照してください。

https://www.rubydoc.info/gems/rails-dom-testing/

なお、コントローラをテストする場合は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ドキュメントを参照してください。

https://api.rubyonrails.org/

### 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ドキュメントを参照してください。

https://api.rubyonrails.org/

以下のメソッドは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ドキュメントを参照してください。

https://www.rubydoc.info/gems/rails-dom-testing/

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

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

- `assert_generates`
- `assert_recognizes`
- `assert_redirected_to`
- `assert_response`
- `assert_routing`

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

https://api.rubyonrails.org/

以下のメソッドは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ドキュメントを参照してください。

https://www.rubydoc.info/gems/rails-dom-testing/

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

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

- `assert_reject_connection`

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

https://api.rubyonrails.org/

### 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ドキュメントを参照してください。

https://api.rubyonrails.org/

## おまけ

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

```ruby 
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
```

```ruby 
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
```