sugulogの日記

Rails、RSpecとfactory_bot!テストに関する基礎知識を集めてみた!!No.1

f:id:sugulog:20201110032637p:plain
こんにちは、すぐるです!

sugulogをお読みいただきありがとうございます!!

このブログは、「 過去の無知な自分に向けてわかりやすく説明するなら?? 」を基準に書いています。

少しでもお役に立てれば幸いです。

 

今回は、RailsRSpecということで

  • テストに関する知識No.1

について簡単に解説します!!

その為このブログを読むことで、RSpecについて理解が深まるのはもちろん、テスト時のカンニングペーパーとしても役に立ちます。

是非最後までご愛読ください。

 

今回は、

  • Rspecの導入

  • テストコードの書き方

  • factory_bot

の順で解説していきます。

では早速、みていきましょう!!

RSpecの導入

gem "rspec-rails", "~> 4.0.0.beta2"をGemfileのgroup :development, :test do〜end(テスト環境)の間に記述し、bundle installしましょう。

その後rails g rspec:installを実行し、Rspecに必要な設定ファイル、ディレクトリを作成しましょう。

※コマンド実行の際に生成されるのは.rspecファイル、specディレクトリ、spec/spec_helper.rbファイル、spec/rails_helper.rbファイルの4つです。

.rspecファイル--format documentationの記述を追加することで、テスト時の表示の出力を段階的に行い綺麗に表示してくれるようになります。

またRailsにおいてRSpecを利用する際に共通の設定を書いておくファイルであるrails_helper.rbファイルは、各テスト用ファイルで読み込むことで共通の設定やメソッドを適用させます!

Rails無しの場合は、spec_helper.rbファイルを読み込みます!!

次にRSpec時にテストコードを書くファイルをspecファイルと呼びますが、そのspecファイルは対応するクラス名_spec.rbという名前で作成します。

そして作成したspecファイルはコマンドで作成したspecディレクトリ中に、テストする機能のディレクトリを作成しその中に格納します。

例えばuserのmodelの機能についてテストする場合は、spec/models/user_spec.rbという構造になります。

・テストコードの書き方

基本的なテストコードを書くにあたって、理解しなければならない概念がいくつかあるのでみていきましょう!

・describe

テストのまとまりを作り、do〜endの間にテストの内容を記述する。

またdescribeに続く""の中には、そのテストの内容を示す説明を記述します。

f:id:sugulog:20201110023439p:plain

※requireでrails_helper.rbファイルを読み込んでいる点にも注意してください。

・it

exampleと呼ばれる実際に動作するテストのまとまりを表し、do〜endの間にexample内容を記述する。

またitに続く""の中には、そのexampleの内容を示す説明を記述します。

f:id:sugulog:20201110024040p:plain

・エクスペクテーション

実際に評価される式(example)のこと。

記述方法としては、expect(X).to マッチャ Yです。

この時、X部分の式の値とY部分の値とがマッチャの条件をクリアした時テストが成功と判断されます。

・マッチャ

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

今回は、eq(等しければ)というマッチャ(条件)を使い記述しました。

f:id:sugulog:20201110025745p:plain

exampleの内容としては1+1の値が2とeq、つまり等しければテスト成功と判断されます。

では最後にbundle exec rspecを実行し、RSpecを利用したテストを実行しましょう。

出力された結果として、exampleの前に1と表示されればテスト成功です。

※failuresの前に1と表示されればテスト失敗です。

・factory_bot

簡単にダミーのインスタンスを作成することができるGem。他のファイルで予め各クラスのインスタンスに定めるプロパティを設定しておき、specファイルからメソッドを利用して読み込むことでインスタンスを作成する。

gem "factory_bot_rails"をGemfileのgroup :development, :test do〜end(テスト環境)の間に記述し、bundle installすることで導入できます!

またファイルを作成する際は、spec/factories/users.rb(ユーザーに関する場合)の構造になるように作成しましょう。

f:id:sugulog:20201110161603p:plain

FactoryBot.define do〜endの間の、factory :クラス名 do〜endの間にダミーのインスタンスを記述します。

では実際に、メソッドを利用して読み込んでみましょう!

・buildメソッド

引数にシンボル方で取ったクラス名のインスタンスをfactory_botの記述をもとに作成するメソッド。

例)user = FactoryBot.build(:user)

・createメソッド

引数にシンボル方で取ったクラス名のインスタンスをfactory_botの記述をもとに作成するメソッド。テスト用のデータベースに値が保存されるが、1回のテスト終了時には内容がロールバック(保存された値が全て消去)される。

例)user = FactoryBot.create(:user)

上記の2つ、どちらかのメソッドを利用することで読み込むことができます。

またrails_helper.rbファイル内のRspec.configure do|config|〜endの間に、config.include FactoryBot::Syntax::Methodsという記述を加えることにより、buildなどでFactoryBotを適用させる際にFactoryBotの記述を省略することができます。

例)user = create(:user, nickname: "")

さらには上記の例のように第二引数にカラム名: 値という形で記述することで、FactoryBotで予めセットした値を上書きすることもできます。

上記の場合だと、suguruという予め設定しておいた値が空に上書きされたということです!

 

以上、今回のブログでした。

RSpecについて理解が深まり、テスト時のカンニングペーパーとしても役に立ちそうですか??

テストを行うのであれば、factory_botも必ず覚えておきたいですね!!

またテストに関する知識についてはNo.2でも解説しているので、是非そちらもお読みください(≧∀≦)/

sugulog.hatenadiary.jp

 

最後に!!

今後も、「 過去の無知な自分に向けてわかりやすく説明するなら?? 」を基準にブログを書いていきます。

少しでも気になった方はお試しでもいいので1度、読者登録お願いします!

またTwitterでもプログラミングに関することを中心に情報を発信してます。

宜しければそちらのフォローもお願いします。

最後までご愛読いただきありがとうございました!!