TECH EXPERT 17日目 テストコード
テストコードでよく使う記述
describe #どんなテストコードかいてんの?
「〇〇について記述する」do~endの間に記述し、入れ子構造可能。
it #こうなるはず
「どのような結果になることを試しているのか」do~endの間に記述し、入れ子構造なし。
example
上記のitに記述した内容の総称、itに書く、「こうなるはず」の例。
expect(X).to eq Y #Xの結果はYなん?
eqのように結果を判断するものを、マッチャという。
context #どんな時を確認したいん?
特定の条件を分けたい場合に用いる。使用方法はdescribeと同じ。
どのような「状況」を確認したいのか
expect(インスタンス).to be_valid #インスタンス機能してるん?
expectのインスタンスが正しく保存されることを判断
expect(X).to include(Y) マッチャ
「Xの中にYという文字列が含まれているかどうか」
マッチャ
expectの中の記述と、結果とのつながりを示す表現。
eqの場合は「XがYに等しくなる」を表現。
テストコードではマッチャを使用して期待通りの結果かどうか判断する。
正しい場合は緑色、正しくない場合は赤色
RSpecのテストコードを実行する際は、bundle exec rspec のコマンド
流れ
保存するデータの作成。
↓
作成したデータが、正しく保存されるかどうかを確認する。
↓
正しく保存されない場合、生成されるエラーメッセージが期待されるものかどうかを確認する。
binding.pry:コードの中に打つことで、一度プログラム処理が止まり、その時点におけるコードの状態をみることができる。確認したい変数の直後に入れるようにします。
なんのパラメータが適応されてるか、わからない時も使える便利マン。
ターミナル実行 bundle exec rspec spec ファイル名
〇〇.valid? 〇〇.errors 〇〇.errors.full_message を活用。
(保存できんの?) ←のエラー表示 ←のエラー文表示
〇〇に自分が調べたい変数をかく、変数だけ実行ならその中身が表示される。
(例:user)
ーテストコードの効率化ー
FactoryBot インスタンス生成をまとめる テストコードで使う
factory :user do <spec/factories/users.rb に記述 #インスタンスの設定
#処理
↓
FactoryBot .build(:user) <spec/models/user_spec.rb に記述 #User のインスタンス生成
before 共通した記述を切り出す
テストコード実行前にFactoryBot .build(:user)を
セットアップする感じ※インスタンス変数にする必要あり。
before do
@user=FactoryBot.build(:user)
Faker ランダムな値の生成 Gem
固定値をランダム化に (メルアド重複などで弾かれるケース考慮)spec/factories/users.rb に編集
追記
contextはどのような「状況」を確認したいのかをdescribeにネストして書く。
be_validを使用して、インスタンスが正しく保存されるか判断できる。
tweets.rb編集時は association :user を追記 (users.rbのFactoryBotとアソシエーションがあることを意味)