Rails テストについて 3 (モデル編)


はじめに

テストに拒否反応があるので、まずは整理したいと思います。
少しづつ記事を書いていきます。
Rails テストについて 1
Rails テストについて 2
もうすでにご存知の方、省略の仕方等ご存知でしたら、ご助言願います。

単体テスト(モデルクラス)

テスト対象

  • photo モデル
  • image(画像)がないと投稿できないようになっているのか確認
photo.rb
class Photo < ApplicationRecord
  belongs_to :post

  validates :image, presence: true

  mount_uploader :image, ImageUploader
end

validates :image, presence: trueというコードからバリデーションかけている。

RSpec関係のキーワード(重要)

  • specファイル : RSpecによるテストコードが書かれたファイル
  • specファイルの保管場所 : rails g rspec:installコマンドで生成された「specディレクトリ」内
  • モデルに関するテスト用ファイル : spec/models/以下に保管
  • コントローラーに関するテスト用ファイル : spec/controllers/以下に保管

specファイルの命名規則(重要)

  • specファイルは対応するクラス名_spec.rbという名前になる。
  • 今回は「photo.rb」に関するspecファイルを作成
    • ということで、名前は「photo_spec.rb」となる。

では早速作成します!

  • フォルダとファイルを追加!(左の項目が緑文字の所です!)

photo_spec.rb内にコードを記述!

  • 詳細は後々説明します!
photo_spec.rb
require 'rails_helper'
describe Photo do
  describe '#create' do
    it "imageがない場合は投稿できないこと" do
      photo = Photo.new(image: "")
      photo.valid?
      expect(photo.errors[:image]).to include("は必要です。")
    end
  end
end

各コードの説明

require 'rails_helper'

  • rails_helper.rb内の記述を読み込むことで共通の設定を有効にしている。
  • この1行目の記述は、全てのspecファイルに書き込む。

describe

  • 直後のdo ~ endまでのテストのまとまりを作る役割。
  • describeの後に続く""(もしくは'')の中にはそのまとまりの説明を書く。
  • 今回は'#create'なおで、Photoクラスにあるcreateメソッドをテストするまとまりという意味。

it do ~ end(exampleと呼ばれる)

  • exampleと呼ばれる実際に動作するテストコードのまとまり。
  • itの後に続く""の中にはそのexampleの説明を書く。
  • 今回は"imageがない場合は投稿できないこと" という説明を書いています。

photo = Photo.new(image: "")

  • テストしたいプロパティを持ったphotoクラスのインスタンスを新規作成します。
  • specファイルの中では、本アプリで作成しているモデルクラスを利用することができる。
  • 今回は"imageがない場合は投稿できないこと"を確かめるテストコードを作成したい。
  • ということで、imageの値を空にしました。

photo.valid?

  • valid?メソッドです。
  • ActiveRecord::Baseを継承しているクラスのインスタンスを保存する際に「バリデーションにより保存ができない状態であるか」を確かめることができる。

①expect(photo.errors[:image]).to include("は必要です。")

  • エクスペクテーションの文法。 expect(X).to include Y
  • xの部分に入れた式の値がYの部分の値と等しければ、テストが成功します。
  • includeの部分を、マッチャと言います。(他にeqやvalidもあります。)

②expect(photo.errors[:image]).to include("は必要です。")

  • 斜字 の所は、errorメソッドです。
  • valid?メソッドの返り値はtrue/falseです。
  • しかしmvalid?メソッドを利用したインスタンスに対してerrorsメソッドが利用できます。
  • バリデーションにより保存ができない状態である場合なぜできないのかを確認することができます。

ではテストしてみましょう!

  • RSpecのテストコードを利用したテストを実行するためのコマンドです。
ターミナル

% bundle exec rspec

このような感じで出力されれば、テスト成功です。

  • imageが空だと投稿できないのが確認できた!

テスト編、続きます!(次はfactory_botというgemを利用して、効率化!)

さいごに

日々勉強中ですので、随時更新します。
皆様の復習にご活用頂けますと幸いです。