みやちゃ
皆さんこんにちは、みやちゃです!
物理とプログラミングについて解説しています!
皆さんは、テストを書いたことがありますか?
「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日間の返金保証付きなので、いつでも返金できます。