Ruby on Rails開発のインターン (Day 4)

こんにちは、皆さん!

最初の週末が終わり、二週目に突入!!
週末は仕事のことは何も触れなかったし、それはいいこと。でも、残念ながら増やす予定だった勤務時間をしっかりやらなかったから今週は毎日8時間勤務だ(笑)
次はもっと計画的に...


  • トピック:
  1. Rspecの実行方法
  2. Rspecでcontrollerをテストする
  3. Rspecのコードカバレッジの実行
  4. build(..)create(..)関数の違い


  • 疑問:


  • 問題:


  • 学習した内容
  1. Rspecでcontrollerのテスト
  2. Rspecでコードカバレッジを実行する
  3. Rspecにおけるbuild(..)create(..)関数の違い


  • 今後やってみたいこと:
  1. Rspecチュートリアル動画を作る


  • リソース:
  1. Ruby for Newbies: Testing with Rspec
  2. Controller specs - RSpec Rails - RSpec - Relish
  3. Ruby code coverage using RSpec, SimpleCov and Jenkins


Rspecの実行方法

もし、Rspecについてあまり知らないのでしたら、この記事が役に立つかもしれません (Rspec の勉強 (パート1)Rspecのインストール - Programming_Shopの日記)


ここからは下記のUserモデルを使います

class User < ApplicationRecord
    validates :name, presence: true
end



最も基本的なRspecの実行方法は

$ rspec spec

僕の時の結果は

Finished in 0.01031 seconds (files took 0.92375 seconds to load)
1 example, 0 failures

でも、下記の方法でもっと詳細を確認できます

$ rspec spec --format documentation

そして、結果がこれ

User
  is not valid without name

Finished in 0.00977 seconds (files took 1.21 seconds to load)
1 example, 0 failures

つまり、 「is not valid without name」という名前のテストがクリアしたってことですね


エラーを発生させるパターンのもやりました

  it "raises an error when saving without name" do
    user = User.new(name: nil)
    expect{user.save!}.to raise_error(ActiveRecord::RecordInvalid, "Validation failed: Name can't be blank")
  end

一つ注意したいのが
"Validation failed: Name can't be blank" はこの通りに書かないといけないということです(大文字、小文字含め)

Rspecでcontrollerをテストする

下記のコードでusers_controllerをテストしました

    it "renders index template" do
        get :index
        expect(response).to render_template("index")
    end

やっていることはとてもシンプルでdef indexにアクセスしてindex.html.erbが表示されるかどうかのテストです。そしたら、次のようなエラーが発生しました。

  1) UsersController renders index template
     Failure/Error: expect(response).to render_template("index")

     NoMethodError:
       assert_template has been extracted to a gem. To continue using it,
               add `gem 'rails-controller-testing'` to your Gemfile.
     # ./spec/controllers/users_controller_spec.rb:6:in `block (2 levels) in <top (required)>'

初めて知ったのですが、controllerをテストしたいのなら gem 'rails-controller-testing'Gemfileに追加しないといけないみたい
そのあとは順調にいきました

Rspecのコードカバレッジの実行

リソース: Ruby code coverage using RSpec, SimpleCov and Jenkins

コードカバレッジRspecで全体のコードのうちどれだけの範囲のコードがしっかりとテストされているかを示してくれます。もちろん100%が一番望ましいが、大きいプロジェクトなら90%以上で大丈夫!


コードカバレッジを見るためにはGemfileに新しいgemを追加しないといけない

gem 'simplecov', require: false, group: :test

bundle installしたのち、sepc/spec_helper.rbの初めの部分に下記のコードを入れます

require 'simplecov'
SimpleCov.start

そしたら、Rspecrspec specで実行!
結果:

Finished in 0.0264 seconds (files took 2.12 seconds to load)
3 examples, 0 failures

Coverage report generated for RSpec to /home/boyiy/Desktop/tester/coverage. 67 / 67 LOC (100.0%) covered.

コードカバレッジが100%と表示されています(よっしゃーー)
そしたら、ブラウザーを開いてtester/coverage/index.htmlファイルを開いて詳細をみましょう!
僕のはこんな感じ:
f:id:Coding_Studio:20180710044419p:plain

build(..)create(..)関数の違い

2つともオブジェクトを作成しますが、build関数はデータベースに作成したものを保存しないのに対し、create関数はします。
データベースにデータを書いたり、読み込むのは時間がかかることが知られています。
ですので、データベースを使わないときはbuild関数を使いましょう!

まとめ

今日はすごくよかった。自分で見つけたバグを治し、なんか達成感を感じた。すでに、プログラムが結構大きくなってるので、どこがどことどうつながっているかを学ぶのにものすごい時間がかかっちゃった。でも、昔やった他のプログラミング言語よりは簡単な気がする。RailsのMCVという決まったデザインはプログラマーにもすごく優しいなと改めて感じた。
Rspecの基礎を学べたのもうれしい。
明日はreCAPTCHAを実行する予定なので頑張っていきますぜ!


ご精読ありがとうございました。では、また次回まで✌




Day 5はこちら↓↓
programming-shop.hatenablog.com


Day 3はこちら↓↓
programming-shop.hatenablog.com