rails で RSpec を使ってみる
前の記事に引き続き、今度は rails のモデルに対して RSpec を使ってみます!
スはスペックのス 【第 1 回】 RSpec の概要と、RSpec on Rails (モデル編)の真ん中くらいから始めていきます。
目次
- 1.Rails プロジェクトの作成
- 2.rspec-rails のインストール
- 3.rspec 用ファイルの作成
- 4.Blog モデルの作成
- 5.Blogのバリデーションを設定する
- 5.スペックファイルの編集
- 6.エラーメッセージのテスト
- 7.Entry モデルの作成
- 8.モデル間の関連のテスト
1.Rails プロジェクトの作成
myblog
という名前のアプリケーションを作りたいので、以下の流れで進めます。
rails プロジェクトの新規作成なので細かいところは割愛します!
$ mkdir myblog
$ cd myblog
$ rails new
2.rspec-rails のインストール
rspec-rails という gem をインストールします。
RSpec公式サイトに最新のバージョンが載っているので確認します!2019年7月20日時点では3.8
です。
Gemfile のgroup :development, :test
内に rspec-rails を指定します。
42行目を追記しています。
ちなみに、デフォルトで書かれているchromedriver-helper
はサポート終了しているそうで、このままにしておくと後で警告されます。
ここでついでに別の gem に変えておきます。
59行目を削除、60行目を追加です🙃🙂
webdrivers
という gem に変更です。
最後にbundle install
を実行です!
3.rspec 用ファイルの作成
$ rails generate rspec:install
を実行すると、rspec用のファイルが作成されます。
4.Blog モデルの作成
テスト対象のモデルがないと進まないので、とりあえず通常どおりBlogモデルを作成します。
$ rails g model Blog name:string
rails db:migrate
ターミナルの画面はこんな感じになっています👀
5.Blogのバリデーションを設定する
Blogモデルの何をテストするかというところですが、ブログの名前を入力必須項目にして、バリデーションが正しく設定されているかをテストします!
Blogモデル(blog.rb)に以下の1行を追加します。
validates :name, presence: true
5.スペックファイルの編集
スペックファイルにテストコードを書いていきます。
blog_spec.rb
を以下のように書きます✍️
これを実行すると failure になります。
新規ブログを作っただけでは名前がないのでバリデーションエラーになって当然ですね💀
実行コマンドは丁寧にパスを指定しましたが、今はrspec
だけでも大丈夫です!
多分パスを指定しない場合はスペックファイルを全部実行するのではないかと思います。
なお、スペックファイルの5行目を以下のようにしてブログの name が空でない場合、テストがパスします。
@blog = Blog.new(name: "BLOGNAME")
6.エラーメッセージのテスト
バリデーションエラーのメッセージに関するテストにはいろいろな方法があるみたいです。
今回はエラーメッセージにcan't be blank
が含まれているかテストします👀
先程のスペックファイルの9~13行目を追記します。
@blog.valid?
は、ここでバリデーションを検証することでエラーメッセージにエラーの値が格納されるとのことです。
参考サイト:Rspecでモデルのvalidateをテストするときの注意
これでテストは通ります🎉🎉
7.Entry モデルの作成
Blogモデルと同様に Entry モデルを作成します。
$ rails g model Entry title:string body:text posted_on:date
$ rails db:migrate
8.モデル間の関連のテスト
今度は Blog モデルと Entry モデルの関連をテストします。
モデル間の関連は以下のとおりです。
- Blog has_many Entry
- Entry belongs_to Blog
本来はモデルファイルに関連を定義するのですが、先にテストから作成します!
先に Failure になるはずのことを行うことで、スペックファイルとモデルファイルが正しくリンクできていることを確認できます。
元サイトのテストコードで使われているhave_at_least
メソッドは今は使えないみたいなので、別の方法をとります💦
8-1. shoulda-matchers をインストール
Gemfile のgroup :test
に shoulda-matchers を追記し、bundle install
で gem をインストールします。
次に、/spec/rails_helper.rb
に以下の1文を追加します。
require 'shoulda/matchers'
8行目のところです😙
同様に/spec/rails_helper.rb
の最後に以下を追加します。
Shoulda::Matchers.configure do |config| config.integrate do |with| with.test_framework :rspec with.library :active_record with.library :active_model with.library :action_controller with.library :rails end end
これで shoulda-matchers の設定完了です!
8-2. テストコードを書く
blog_spec.rb と entry_spec.rb をそれぞれ以下のように書きます。
8-3. テストを実行する(失敗する)
$ rspec spec/models
で2つまとめてテストを実行しますが、アソシエーションの設定をしていないので当然失敗します🤨
8-4. アソシエーションを設定する
blog.rb
にhas_many :entries
を追加entry.rb
にbelongs_to :blog
を追加- entry のマイグレーションファイルに
t.references :blog, foreign_key: true
を追加 $ rails db:migrate
これでモデルの関連付けができると思います🎉
もし最後にうまくいかなかったら、DBを一旦リセットすると良いと思います!
$ rails db:drop
$ rails db:create
$ rails db:migrate
8-5. テストを実行する(成功)
最後にテストを再度実行して、成功していることを確認します!🎊