個人アプリ開発 RSpec 単体テスト
作業内容
gemのRSpecを使用し、単体テストを行いました。
手順を自分なりにまとめながら進めました。
今回はユーザー登録の際のテストを記述しましたが、
これだけでは少なすぎるので、今後もう少し増やしていきたいと思います。
現場でテストは必須ですし、DevOps系の技術を学ぶ際にも重要だと思うので、記述量を増やしつつ理解を深めていきます。
gem インストール
group :development, :test do ーーー省略ーーー gem 'rspec-rails' end group :development do gem 'web-console' end
→bundle install
RSpecの設定
$ rails g rspec:install #RSpec用設定ファイルの作成
specファイルの作成
→テストを実行(中身が空のコード)
[spec/models/user_spec.rb] require 'rails_helper' describe User do describe '#create' do it "nicknameがない場合は登録できないこと" do end end end
describe:
直後のdo ~ endまでのテストのまとまりを作り、””の中に説明を入れる
itとexample:
実際に動作するテストコードのまとまり。""の中にはそのexampleの説明を書く。
エクスペクテーション:
実際に評価される式。it do ~ endの間に書く。
→文法は”expect(X).to eq Y”
マッチャ:
エクスペクテーションの中で、テストが成功する条件。
eqは「等しければ」という意味。
他にもinclude(含んでいれば)、valid(バリデーションされれば)などがある。
$ bundle exec rspec => User #create nicknameがない場合は登録できないこと Finished in 0.1379 seconds (files took 3.28 seconds to load) 1 example, 0 failures
現在はまだテストとして評価される式を書いていないので、テストは無条件でパス。
実際に記述していく。
ユーザー名がない場合
require 'rails_helper' describe User do describe '#create' do it "nameがない場合は登録できないこと" do user = User.new(name: nil, email: "kkk@gmail.com", password: "00000000", password_confirmation: "00000000") user.valid? expect(user.errors[:name]).to include("を入力してください") end end
factory_botを導入
factory_bot:
ダミーのインスタンスを作成することができるGem。exampleの記述を減らし効率化する。
1.gem install
2.specディレクトリ直下に「factories」というディレクトリを追加し、その中に「users.rb」という名前でファイルを作成
3.users.rbの編集
FactoryBot.define do factory :user do name {"teramoto"} email {"kkk@gmail.com"} password {"00000000"} password_confirmation {"00000000"} end end
★buildメソッド
#factory_botを利用しない場合 user = User.new(name: "abe", email: "kkk@gmail.com", password: "00000000", password_confirmation: "00000000") #factory_botを利用する場合 user = FactoryBot.build(:user)
★createメソッド
#createしたインスタンスはDBに保存される user = FactoryBot.create(:user)
※1回のテストが実行され、終了する毎にテスト用のDBの内容がロールバックされる。(保存された値がすべて消去されてしまう)
従って、binding.pry等でテストの実行を一時停止しないとテスト用のDBに保存された値をSequel Pro等で確認することはできない。
factory_botの記法の省略
rails_helper.rb
#省略 RSpec.configure do |config| #下記の記述を追加 config.include FactoryBot::Syntax::Methods #省略 end
省略を用いて、記述の変更
it "nameがない場合は登録できないこと" do user = build(:user, name: nil) user.valid? expect(user.errors[:name]).to include("can't be blank") end
テストコードを書く際の原則
①各exampleで期待する値は1つ
②期待する結果をはっきりわかりやすく記述
③起きて欲しいことと起きてほしくないこと両方をテストする
④境界値をテストする
⑤可読性を考えつつ、適度にDRYにする
上記を基にユーザー登録時のテストを書いていきました。