最終課題にてRSpecを記述したので備忘録として投稿させていただきます。
RSpecを書く理由は?
webアプリケーションをデプロイする前に必ずテストコードを書かなければいけません。
プログラムは想定していなかった動きを見せる可能性が高くなります。
TVゲームに例えるとデバック作業みたいな感じです。
また、ポートフォリオとしてもRSpecができていないと不採用する企業も多いです。
factory_botとは
簡単にダミーのインスタンスを作成することができるGemです。
factory_botにダミーのデータを予め設定する。
spec.rbの中に名前や数字等々を入力するがfactory_botを作成することにより
何回も書くことを防ぐことができます。
作成場所はspecディレクトリ直下に「factories」というディレクトリを追加し、その中に「users.rb」という名前でファイルを作成してください。必ず複数形の[s]を入れること!!
spec(フォルダ) /factories(フォルダ)/ users.rb(ファイル)
下記は例になります
FactoryBot.define do
factory :user do
nickname {"yamada"}
email {"qqq@gmail.com"}
password {"00000000"}
password_confirmation {"00000000"}
end
end
また、factory_botを使うには必ずconfig.include FactoryBot::Syntax::Methodsを記述
しなければいけません。記述場所は以下を参照して下さい。
RSpec.configure do |config|
# Remove this line if you're not using ActiveRecord or ActiveRecord fixtures
config.fixture_path = "#{::Rails.root}/spec/fixtures"
config.include FactoryBot::Syntax::Methods #これを記述しないとエラーが出ます
# If you're not using ActiveRecord, or you'd prefer not to run each of your
# examples within a transaction, remove the following line or assign false
# instead of true.
config.use_transactional_fixtures = true
modelsにテストコードを記述
単語の説明からします。
・describe▼
describeは、直後のdo ~ endまでのテストのまとまりを作ります。
describeの後に続く""の中にはそのまとまりの説明を書きます。
・itとexample▼
itはexampleと呼ばれる実際に動作するテストコードのまとまりを表します。
itの後に続く""の中にはそのexampleの説明を書きます。
・エクスペクテーション▼
実際に評価される式のことです。it do ~ endの間に書きます。
上記の式ではexpect(1 + 1).to eq 2の部分がエクスペクテーションです。
・expectメソッド▼
エクスペクテーションの文法です。xの部分に入れた式の値がYの部分の値と等しければ、
テストが成功します。eqの部分を、マッチャと言います。
・マッチャ▼
エクスペクテーションの中で、テストが成功する条件を示します。例えばeqは「等しければ」という意味になります。他にも
include(含んでいれば)、valid(バリデーションされれば)など複数のマッチャが存在します。
・valid?メソッド▼
valid?メソッドを利用すると、ActiveRecord::Baseを継承しているクラスのインスタンスを保存する際に「バリデーションにより保存ができない状態であるか」を確かめることができます。~ができない場合はという記述に使用する。
記述するコツとしては
①各exampleで期待する値は1つ
②期待する結果をはっきりわかりやすく記述
③起きて欲しいことと起きてほしくないこと両方をテストする
④境界値をテストする
⑤可読性を考えつつ、適度にDRYにする
下記sampleを記述します
require 'rails_helper'
describe ShippingInfo do #factory_botに記述しているShippingInfoのデータを表している
describe '#create' do # '#create'は登録する際のアクションコントローラーはcreateのため
# 入力されている場合のテスト ▼
it "全ての項目の入力が存在すれば登録できること" do
shipping_info = build(:shipping_info)
expect(shipping_info).to be_valid
end
# nul:false,presence: trueのテスト ▼
it "nameがない場合は登録できないこと" do
item = build(:item, name: nil)
item.valid?
expect(item.errors[:name]).to include("を入力してください")
end
it "priceが300未満は登録できないこと" do
item = build(:item, price: 299)
item.valid?
expect(item.errors[:price]).to include("は300より大きい値にしてください")
end
it "priceが9999999を超過する場合は登録できないこと" do
item = build(:item, price: 10000000)
item.valid?
expect(item.errors[:price]).to include("は9999999より小さい値にしてください")
end
end
end
最後にターミナルでテストを実行します
bundle exec rspec
今回は基本的なRSpecを投稿しましたがもっと複雑なパターンもあります。
チャレンジしたいと思います。