モデルテストの基本

学習の目標

本章では、以下の内容を学習します。

  • Railsにおけるモデルの役割と重要性を理解する
  • RSpecを使用したモデルテストの基本構造を習得する
  • テストファイルの作成から実行までの流れを学ぶ
  • be_validマッチャーを使った基本的な検証方法を理解する
  • テスト駆動開発の第一歩を踏み出す

はじめに

Railsアプリケーションを開発する上で、モデルは非常に重要な役割を果たします。モデルは、データベースとのやり取りを担当し、アプリケーションのビジネスロジックを実装する場所です。

たとえば、ブログアプリケーションなら記事(Article)や著者(Author)、ECサイトなら商品(Product)や注文(Order)といったデータを扱うのがモデルの仕事です。モデルは、これらのデータを保存したり、取得したり、更新したりする処理を担当します。

モデルのテストを書くことで、データの整合性やビジネスロジックが正しく動作することを確認できます。バグを早期に発見できるだけでなく、将来の変更に対しても安心して対応できるようになります。

この章では、シンプルな記事(Article)モデルを作成し、RSpecを使って基本的なテストを書いていきます。実際に手を動かしながら、モデルテストの基本を身につけていきましょう。

モデルの作成

それでは早速、テスト対象となるモデルを作成していきます。今回は、ブログの記事を表すArticleモデルを作ってみましょう。

ターミナルを開いて、以下のコマンドを実行してください。

bundle exec rails g model Article title:string content:text

このコマンドは、Railsのジェネレーター機能を使って新しいモデルを作成します。Articleという名前のモデルに、title(タイトル)とcontent(内容)という2つの属性を持たせています。

title:stringは文字列型の属性で、記事のタイトルを保存します。content:textはテキスト型の属性で、より長い文章である記事の本文を保存するのに適しています。

コマンドを実行すると、いくつかのファイルが自動生成されます。その中には、モデルファイル本体だけでなく、データベースのテーブルを作成するためのマイグレーションファイルや、テスト用のファイルも含まれています。

前章でRSpecをセットアップしたおかげで、specディレクトリ内にモデルのテストファイルも自動的に生成されているはずです。これがRailsとRSpecを連携させることの便利な点の一つです。

データベースのマイグレーション

モデルを作成したら、次はデータベースに対応するテーブルを作成する必要があります。以下のコマンドを順番に実行してください。

bundle exec rails db:migrate
bundle exec rails db:migrate RAILS_ENV=test

最初のコマンドは開発環境のデータベースにテーブルを作成し、2つ目のコマンドはテスト環境のデータベースにも同じテーブルを作成します。

なぜテスト環境にも別途マイグレーションが必要なのでしょうか? Railsでは、開発環境とテスト環境で別々のデータベースを使用します。これにより、テストを実行してもお互いのデータが混ざることなく、安全にテストを行うことができます。

テストファイルの構造

モデルとデータベースの準備が整ったので、いよいよテストを書いていきます。

自動生成されたspec/models/article_spec.rbファイルを開いてみましょう。以下のような内容になっているはずです。

require 'rails_helper'
RSpec.describe Article, type: :model do
pending "add some examples to (or delete) #{__FILE__}"
end

このファイルの構造を詳しく見ていきましょう。

rails_helperの読み込み

1行目のrequire 'rails_helper'は、Railsアプリケーションをテストするために必要な設定を読み込んでいます。この行は、Railsに関連するテストを書く際には必ず必要になります。

rails_helper.rbには、Railsアプリケーションをテスト環境で動かすための様々な設定が含まれています。データベースの接続設定やテスト用のヘルパーメソッドなど、テストを快適に書くための準備がすべて整えられています。

RSpec.describeブロック

RSpec.describe Article, type: :model doという行は、Articleモデルに関するテストをグループ化するためのブロックです。

type: :modelというオプションは、これがモデルのテストであることをRSpecに伝えています。このオプションを指定することで、モデルテスト専用の便利な機能が使えるようになります。

pendingメッセージ

pendingで始まる行は、「まだテストを書いていません」という仮のメッセージです。実際のテストを書く際には、この行を削除して、本当のテストコードに置き換えます。

最初のテストを書く

それでは、実際にテストを書いてみましょう。まずは最もシンプルなテストとして、「記事を正しく作成できるか」を確認するテストを実装します。

spec/models/article_spec.rbを以下のように書き換えてください。

require 'rails_helper'
RSpec.describe Article, type: :model do
it '記事を正しく作成できる' do
article = Article.new(title: 'RSpecの基本', content: 'RSpecを学びましょう')
expect(article).to be_valid
end
end

このテストコードを詳しく見ていきましょう。

itブロックでテストケースを定義

it '記事を正しく作成できる' doという行は、一つのテストケースを定義しています。itの後に続く文字列は、このテストが何を検証しているのかを日本語で説明しています。

わかりやすい説明を書くことで、テストが失敗したときにどこに問題があるのかをすぐに理解できるようになります。

テストデータの作成

article = Article.new(title: 'RSpecの基本', content: 'RSpecを学びましょう')という行では、テスト用のArticleオブジェクトを作成しています。

Article.newメソッドに、タイトルと内容を指定してインスタンスを生成しています。この時点では、まだデータベースには保存されていない状態です。

期待値の検証

expect(article).to be_validという行が、実際の検証を行っている部分です。

expectメソッドは、「〜であることを期待する」という意味で、テストの中心となる部分です。be_validは、Railsモデルが有効な状態かどうかを確認するマッチャーです。

つまり、この行は「作成したarticleオブジェクトが有効であることを期待する」という意味になります。現時点では特にバリデーションを設定していないので、どんな値でも有効と判定されるはずです。

テストを実行する

テストを書いたら、実際に実行してみましょう。ターミナルで以下のコマンドを実行してください。

bundle exec rspec

テストが成功すると、以下のような結果が表示されます。

Article
記事を正しく作成できる
Finished in 0.07483 seconds (files took 4.11 seconds to load)
1 example, 0 failures

無事にテストが成功しました。ここで表示されている内容を詳しく見ていきましょう。

出力を見ると、Articleというグループの下に「記事を正しく作成できる」というテストが表示されています。これは、前章で設定した--format documentationオプションの効果です。

1 example, 0 failuresという結果は、1つのテストを実行して、失敗が0件だったことを示しています。

まとめ

本章では、RSpecを使ったモデルテストの基本を学びました。以下の内容を理解できたことと思います。

  • Railsのジェネレーターを使ったモデルの作成方法
  • 開発環境とテスト環境で別々のデータベースを使う理由
  • モデルテストファイルの基本的な構造
  • itブロックを使ったテストケースの定義方法
  • expectbe_validを使った基本的な検証の書き方
  • テストの実行方法と結果の読み方

今回は最もシンプルなテストを書きましたが、実際の開発では、バリデーションやアソシエーション、カスタムメソッドなど、より複雑なテストを書くことになります。

しかし、基本的な構造は今回学んだものと同じです。この基礎をしっかりと理解しておけば、より高度なテストも書けるようになるでしょう。

このセクションは有料サブスクリプションへの登録、またはログインが必要です。完全なコンテンツにアクセスするには、料金ページ(/pricing)をご覧ください。購入済みの場合は、ログインしてください。

Basicプランでより詳しく学習

この先のコンテンツを読むにはBasicプラン以上が必要です。より詳細な解説、実践的なサンプルコード、演習問題にアクセスして学習を深めましょう。

作成者:とまだ
Previous
Ruby on Railsプロジェクトのセットアップ