個人アプリ開発 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にする



上記を基にユーザー登録時のテストを書いていきました。