Rubyテスト(RSpec)モデル

zenkiです。

私が作成している投稿アプリのテストを行う際に、少し抜けているところがあったのでまとめておきたいと思います。

この記事ではRuby on Railsで作成したアプリのモデルのテストのやり方を書いていきます。

まず、テストを行うためのGemであるRSpecと、擬似データを作成するGemのfactory_botをインストールします。

ダウンロードが終わればrails_helper.rbフォルダにテストで使う共通の設定を記述し、.respecに-- format documentationの記述を追加すれば準備完了です。

RSpecによってテストコードが書かれたファイルは、specファイルと呼ばれ「対応するクラス名_spec.rb」の名前でspecディレクトリに格納されます。

一番基本的な1+1が2になるか確かめるテストは下記の記述になります。

describe "houhou" do
 it "1 + 1 = 2 "do 
  expect(1 + 1 ).to eq 2
 end
end

それぞれの記述が持つ意味を書いていくと、まずdescribe ~ do はテストのグループ化を行います。

そして次のit ~ do のブロックの中に書かれているexpect(A).to eq Bが実際チェックされる式になります。このexpect(A).to eq Bの中の.eqがテストが成功するかの条件となり、マッチャと呼ばれます。

ここではeq(等しければ)といったマッチャが使われていますが、引数にとった値がexpectの引数の配列に含まれるかを確認できるincludeマッチャなども存在します。

実際にUserモデルのテストなどを行う際に、テストの度にインスタンスを生成するコードを書くのは時間がかかります。その労力を減らすために使うのがfactory_botというGemになります。

このGemを使えばfactoriesディレクトリに設定したデータを元にインスタンスを作成することが狩野になります。factoriesディレクトリはspecディレクトリ下に配置し、userモデルのテストならuser.rb、postモデルのテストならpost.rbの名前のファイルを作成し、その中にこのように記述します

FactoryBot.define do

  factory :user do
    nickname              {"sakamoto"}
    email                 {"sugano@gmail.com"}
    password              {"12345678"}
    password_confirmation {"12345678"}
  end

end

このように設定を書いたのちuser_spec.rbファイルで

require 'rails_helper'

describe User do
  describe '#create' do

    it "is invalid without a nickname" do
      user = Factorybot.build(:user, nickname: nil)
      ~~~~
    end

end

このように記述すれば、DBに残らない擬似データを生成することができます。ちなみに、buildの記述をcreateに変えればテストの間だけはDBに内容が保存されるように設定することも可能です。

以上です。