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に内容が保存されるように設定することも可能です。
以上です。