どぼじょのIT学習ブログ

高専卒土木女子がIT業界を目指してお勉強。

rails で RSpec を使ってみる

前の記事に引き続き、今度は rails のモデルに対して RSpec を使ってみます!
スはスペックのス 【第 1 回】 RSpec の概要と、RSpec on Rails (モデル編)の真ん中くらいから始めていきます。

目次

1.Rails プロジェクトの作成

myblogという名前のアプリケーションを作りたいので、以下の流れで進めます。
rails プロジェクトの新規作成なので細かいところは割愛します!

  1. $ mkdir myblog
  2. $ cd myblog
  3. $ rails new

2.rspec-rails のインストール

rspec-rails という gem をインストールします。
RSpec公式サイトに最新のバージョンが載っているので確認します!2019年7月20日時点では3.8です。
Gemfile のgroup :development, :test内に rspec-rails を指定します。

f:id:mistyrinth:20190720170631p:plain
42行目を追記しています。

ちなみに、デフォルトで書かれているchromedriver-helperはサポート終了しているそうで、このままにしておくと後で警告されます。
ここでついでに別の gem に変えておきます。
f:id:mistyrinth:20190720173146p:plain
59行目を削除、60行目を追加です🙃🙂
webdriversという gem に変更です。

最後にbundle installを実行です!

3.rspec 用ファイルの作成

$ rails generate rspec:installを実行すると、rspec用のファイルが作成されます。

4.Blog モデルの作成

テスト対象のモデルがないと進まないので、とりあえず通常どおりBlogモデルを作成します。

  1. $ rails g model Blog name:string
  2. rails db:migrate

ターミナルの画面はこんな感じになっています👀
f:id:mistyrinth:20190720171517p:plain

5.Blogのバリデーションを設定する

Blogモデルの何をテストするかというところですが、ブログの名前を入力必須項目にして、バリデーションが正しく設定されているかをテストします!
Blogモデル(blog.rb)に以下の1行を追加します。

validates :name, presence: true

f:id:mistyrinth:20190720174713p:plain

5.スペックファイルの編集

スペックファイルにテストコードを書いていきます。
blog_spec.rbを以下のように書きます✍️

gist.github.com

これを実行すると failure になります。
新規ブログを作っただけでは名前がないのでバリデーションエラーになって当然ですね💀
f:id:mistyrinth:20190720175305p:plain

実行コマンドは丁寧にパスを指定しましたが、今はrspecだけでも大丈夫です!
多分パスを指定しない場合はスペックファイルを全部実行するのではないかと思います。

なお、スペックファイルの5行目を以下のようにしてブログの name が空でない場合、テストがパスします。

@blog = Blog.new(name: "BLOGNAME")

6.エラーメッセージのテスト

バリデーションエラーのメッセージに関するテストにはいろいろな方法があるみたいです。
今回はエラーメッセージにcan't be blankが含まれているかテストします👀

先程のスペックファイルの9~13行目を追記します。

gist.github.com

f:id:mistyrinth:20190720181747p:plain

@blog.valid?は、ここでバリデーションを検証することでエラーメッセージにエラーの値が格納されるとのことです。
参考サイト:Rspecでモデルのvalidateをテストするときの注意

これでテストは通ります🎉🎉
f:id:mistyrinth:20190720181926p:plain

7.Entry モデルの作成

Blogモデルと同様に Entry モデルを作成します。

  1. $ rails g model Entry title:string body:text posted_on:date
  2. $ 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'

f:id:mistyrinth:20190720185427p:plain
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 をそれぞれ以下のように書きます。

gist.github.com

gist.github.com

8-3. テストを実行する(失敗する)

$ rspec spec/modelsで2つまとめてテストを実行しますが、アソシエーションの設定をしていないので当然失敗します🤨

f:id:mistyrinth:20190720191453p:plain

8-4. アソシエーションを設定する

  1. blog.rbhas_many :entriesを追加
  2. entry.rbbelongs_to :blogを追加
  3. entry のマイグレーションファイルにt.references :blog, foreign_key: trueを追加
  4. $ rails db:migrate

f:id:mistyrinth:20190720192741p:plain

これでモデルの関連付けができると思います🎉
もし最後にうまくいかなかったら、DBを一旦リセットすると良いと思います!

  1. $ rails db:drop
  2. $ rails db:create
  3. $ rails db:migrate

8-5. テストを実行する(成功)

最後にテストを再度実行して、成功していることを確認します!🎊
f:id:mistyrinth:20190720192855p:plain