Ruby on Rails プログラミング 日記投稿サービスを1から作る

【Rspec入門#2】Rails6でRspecのテストを書く

 

みやちゃ

 

皆さんこんにちは、みやちゃです!

物理とプログラミングについて解説しています!

皆さんは、テストを書いたことがありますか?

「Railsでポートフォリオは作ったけど、テストは書いていない」という方が多いのではないでしょうか?

Railsエンジニアとして働く以上、テストが書けないと、「まじで......」って反応をされます。。(実体験)

そこで今回からRspecについて徹底的に解説していきます!

今回は
  • テストをするRailsアプリケーションの作成
  • テストをどうやって書くのか(簡単なテストを書きます)
この記事を読むと

Rspecで簡単なテストが書けるようになります!

Railsアプリケーションの作成

なるべく同じ環境で作業できるように、テストを実行するRailsアプリの作成から行なっていきます。

アプリの中身としては、ユーザーが日記を投稿できるアプリケーションです。

rails new

rails newからやっていきます。

ターミナルを開き、「rails new [アプリケーション名]」を実行します。

私は「rspec_sample」という名前のアプリケーションにしました。

miyacha$ rails new rspec_sample

この結果、以下のような結果が返ってくれば、無事アプリが作成されました。

├─ webpack-dev-middleware@3.7.3
├─ webpack-dev-server@3.11.2
├─ websocket-driver@0.7.4
├─ websocket-extensions@0.1.4
└─ ws@6.2.1
✨  Done in 9.89s.
Webpacker successfully installed 🎉 🍰

deviseの導入

ユーザーのログイン機能等のためのdeviseをインストールします。

Gemfileを開き、以下の一文を追加します。

gem 'devise'

ファイルを保存したら、ターミナルでbundleを実行しましょう。(cdコマンドで作成したアプリのところに移動するのを忘れずに!)

miyacha$ cd rspec_sample
rspec_sample miyacha$ bundle install

次にジェネレーターを実行します。

rspec_sample miyacha$ rails generate devise:install

上のコマンドを実行すると、以下のような結果が返ってきます。

      create  config/initializers/devise.rb
      create  config/locales/devise.en.yml
===============================================================================

Depending on your application's configuration some manual setup may be required:

  1. Ensure you have defined default url options in your environments files. Here
...

「your environments files」にdefault url optionsを定義する必要があるよと言われているので、ちゃんと定義してあげましょう。

config/environments/development.rbを開き、以下の1行を追加します。

Rails.application.configure do

...省略
↓この1行を追加
  config.action_mailer.default_url_options = { host: 'localhost', port: 3000 }
...
end

また、Userというモデルを使いたいので、以下のコマンドを実行します。

rspec_sample miyacha$ rails generate devise User

忘れずに「rails db:migrate」を実行します。

rspec_sample miyacha$ rails db:migrate

scaffoldでpostモデルを作成

次にPostモデル(投稿モデル)を作成します。

全部自動で作成してくれる便利なscaffoldを使います。

rspec_sample miyacha$ rails generate scaffold post title:string body:text user_id:integer

...

rspec_sample miyacha$ rails db:migrate

次にルーティングを設定します。

config/routes.rbを開き、以下の1行を追加してください。

Rails.application.routes.draw do
ここから
  root to: 'posts#index'
ここまで
  resources :posts
  devise_for :users
  # For details on the DSL available within this file, see https://guides.rubyonrails.org/routing.html
end

また、models/post.rbを開き、以下の一文を追加してください。

class Post < ApplicationRecord
  belongs_to :user
end

同様に、models/user.rbを開き、以下の一文を追加してください。

class User < ApplicationRecord
  # Include default devise modules. Others available are:
  # :confirmable, :lockable, :timeoutable, :trackable and :omniauthable
  devise :database_authenticatable, :registerable,
         :recoverable, :rememberable, :validatable
ここから  
  has_many :posts
ここまで
end

アプリケーションがちゃんと動くか確認

作成したアプリがちゃんと動くか確認しましょう。

ブラウザを開いて、「http://localhost:3000/」にアクセスします。

できてるみたいですね。

ちゃんとアプリとして動いているかはテストで確認しましょう。

before_actionの追加

また、Userがログインしていないと、投稿を作成できないように設定しましょう。

posts_controller.rbファイルを開いて、以下の一文を追加してください。

before_action :authenticate_user!, only: [:new, :create, :edit, :update, :destroy]

Rspecでテストを書くための準備

ここからが本番です。(長かった。。)

ここからRspecをインストールしますが、こちらの記事で詳しく解説しているので、参考にしてインストールしてください。

Rspec入門 導入

まずは簡単なテストを試しに書いてみる

こちらの記事を参考にしてインストールできましたでしょうか?

ちゃんとインストールできたか確認のために、ターミナルで以下のコマンドを実行してください。

rspec_sample miyacha$ bin/rspec

以下のような結果が返ってくれば、インストールできています。

Running via Spring preloader in process 93919
No examples found.


Finished in 0.00052 seconds (files took 0.23918 seconds to load)
0 examples, 0 failures

それでは、簡単なテストを書いて、実行してみましょう。

specフォルダの下に、「samples」というフォルダを作成します。「samoples」フォルダの中に、「sample_spec.rb」というファイルを作成します。

ファイルが作成できたら、中身を以下のようにしてください。

require "spec_helper"

describe String do
  it "sample test" do
    a = 1
    b = 2
    expect(a+b).to eq 3
  end
end

今後たくさんのテストファイルを書いていきますが、テストファイルには、必ず「require "spec_helper"」の1行が必要になります。

これは、spec_helper.rbファイルを読み込んでいます。

中身を見てみると、なんとなく何が書いているかわかるのではないでしょうか?

「aという関数に1を代入、bという関数に2を代入して、予期される a+b の結果は、3である」みたいなことが書いてあります。

それでは実行してみます。

rspec_sample miyacha$ bin/rspec spec/samples/sample_spec.rb

上のコマンドは、「bin/rspec ファイル名」で特定のファイルのテストを実行できます。

「bin/rspec」のみで実行すると、全てのテストファイルが実行されます。

Running via Spring preloader in process 94033
.

Finished in 0.00638 seconds (files took 0.08998 seconds to load)
1 example, 0 failures

上記のような結果が返ってくれば、テスト成功です。

失敗していれば、「failures」のところが「1」となるはずです。

まとめ

いかがでしたでしょうか?

今回は、Rspecの簡単なテストを書いてみました。

次回からはモデル、コントローラー、ビューのテスト、統合テストにも挑戦していくので、ぜひご覧ください。

 

みやちゃ

 

ここまでご覧いただきありがとうございます!

こちら のUdemyの動画教材は、8時間で、

  • Dockerで仮想環境構築
  • Railsの基礎を解説しながら、アプリケーション開発
  • RSpecでテストを記述

まで解説しています。

Udemyの教材へ

Railsエンジニアとして働くために必要な、DockerとRSpecを同時に解説してくれています。

DockerとRSpecを使って作ったポートフォリオはかなり評価が高くなります。

ぜひ動画を見てみてはいかがでしょうか?

Udemyの教材へ

受講生は、5000人以上!です。

さらに、Udemyは、30日間の返金保証付きなので、いつでも返金できます。

たったの8時間でDocker、Rails、Rspecを学ぶ即戦力Railsエンジニア養成講座

© 2021 みやちゃのブログ Powered by AFFINGER5