アラフォ〜プログラミング未経験会社員のエンジニアへの道

神奈川県横浜市在住。アラフォーで小学生の息子あり。プログラミング勉強中でHTML/CSS, Ruby, Ruby on Rails, Javascriptなど。 いずれAI関連サービスを開発したい。

[アラフォプログラミング未経験]RSpecの基本構文について学ぶ

今回は、「RSpec」の基本構文について学びます。

Ruby のテストコードなので、Rubyにルールが似ててそこまで拒否感はないですね。

むしろすんなり受け入れますわ〜

目次

describe

1行目のdescribeは、直後のdo ~ endまでのテストのまとまりを作ります。

describeの後に続く""の中にはそのまとまりの説明を書きます。

itとexample

2行目のitはexampleと呼ばれる実際に動作するテストコードのまとまりを表します。

itの後に続く""の中にはそのexampleの説明を書きます。

エクスペクテーション

実際に評価される式のことです。

it do ~ endの間に書きます。

上記の式ではexpect(1 + 1).to eq 2の部分がエクスペクテーションです。

expect(X).to eq Y

エクスペクテーションの文法です。

xの部分に入れた式の値がYの部分の値と等しければ、テストが成功します。

eqの部分を、マッチャと言います。

マッチャ

エクスペクテーションの中で、テストが成功する条件を示します。

例えばeqは「等しければ」という意味になります。

他にもinclude(含んでいれば)、valid(バリデーションされれば)など複数のマッチャが存在します。

|javascript| require 'rails_helper'

describe User do describe '#create' do it "is invalid without a nickname" do end end end ||<

1行目のrequire 'rails_helper'は、rails_helper.rb内の記述を読み込むことで共通の設定を有効にしています。

この1行目の記述は、全てのspecファイルに書き込みます。

3, 4行目に連続してdescribeが登場しています。describeは、このようにネスト(入れ子状)にすることができます。ここでは「Userクラスにあるcreateメソッドをテストするまとまり」であることを示しています。このように、describeとdoの間にメソッド名を書く際は#をつけるのが慣習です。

bundle exec rspecコマンド

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

ターミナル

|| bundle exec rspec ||<

「nicknameが空の場合登録できないことを確かめる」テストコードを書いていきます。

|javascript| require 'rails_helper'

describe User do describe '#create' do it "is invalid without a nickname" do user = User.new(nickname: "", email: "kkk@gmail.com", password: "00000000", password_confirmation: "00000000") user.valid? expect(user.errors[:nickname]).to include("can't be blank") end end end ||<

【5行目】テストしたいプロパティを持ったuserクラスのインスタンスを新規作成する

スペックファイルの中では、そのRailsプロジェクトで作成しているモデルクラスを利用することができます。

今回は「nicknameが空である場合登録できないこと」を確かめるテストコードを作成したいのでnicknameの値を空にし、

それ以外は適当な値をセットした状態でuserクラスのインスタンスを作成しています。

【6行目】作成したインスタンスがバリデーションによって保存ができない状態かチェックする

続いて、新規作成したuserクラスのインスタンスがバリデーションに引っかかるかどうかを確かめるvalid?メソッドを利用します。

valid?メソッド

valid?メソッドを利用すると、

ActiveRecord::Baseを継承しているクラスのインスタンスを保存する際に

「バリデーションにより保存ができない状態であるか」を確かめることができます。

errorsメソッド

valid?メソッドの返り値はtrue/falseですが、

valid?メソッドを利用したインスタンス対してerrorsメソッドを利用すると、

バリデーションにより保存ができない状態である場合なぜできないのかを確認することができます。

includeマッチャ

includeマッチャは、引数にとった値がexpectの引数である配列に含まれているかをチェックすることができるマッチャです。

今回の場合、「nicknameが空の場合はcan't be blankというエラーが出るはずだ」ということがわかっているため、

include("can't be blank")のように書くことができます。実際にその通りになればこちらのエクスペクテーションはパスし、

このコードは意図した動作をすると保証できます。

コードに関する説明は以上です。テストを実行してみましょう。

メールアドレスが存在しなければ登録できないことを確かめるテストコードを書いてみました。

バリデーションをかけることで、メールアドレスが入力されていないと登録できない実装がしてあります。テストコードを書くことで、メールアドレスが存在しなければ登録できないことを確かめましょう。