Ruby on Rails開発のインターン (Day 4)
こんにちは、皆さん!
最初の週末が終わり、二週目に突入!!
週末は仕事のことは何も触れなかったし、それはいいこと。でも、残念ながら増やす予定だった勤務時間をしっかりやらなかったから今週は毎日8時間勤務だ(笑)
次はもっと計画的に...
- トピック:
- 疑問:
- 問題:
- 学習した内容
- 今後やってみたいこと:
- リソース:
- Ruby for Newbies: Testing with Rspec
- Controller specs - RSpec Rails - RSpec - Relish
- Ruby code coverage using RSpec, SimpleCov and Jenkins
Rspecの実行方法
ここからは下記の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で全体のコードのうちどれだけの範囲のコードがしっかりとテストされているかを示してくれます。もちろん100%が一番望ましいが、大きいプロジェクトなら90%以上で大丈夫!
コードカバレッジを見るためにはGemfile
に新しいgemを追加しないといけない
gem 'simplecov', require: false, group: :test
bundle install
したのち、sepc/spec_helper.rb
の初めの部分に下記のコードを入れます
require 'simplecov' SimpleCov.start
そしたら、Rspecをrspec 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
ファイルを開いて詳細をみましょう!
僕のはこんな感じ:
build(..)
とcreate(..)
関数の違い
build
関数はデータベースに作成したものを保存しないのに対し、create
関数はします。データベースにデータを書いたり、読み込むのは時間がかかることが知られています。
ですので、データベースを使わないときは
build
関数を使いましょう!まとめ
Rspecの基礎を学べたのもうれしい。
明日はreCAPTCHAを実行する予定なので頑張っていきますぜ!
ご精読ありがとうございました。では、また次回まで✌