RSpec
今日は、「コピペせず、1回はする」を試してみた。
結構頭に入る。
RSpec
「Spec」 = テストコード
「Ruby」 + 「Spec」 = Rubyのテストコード
なぜ Spec = テストコード?
≪chatGPT先生≫
「spec」という用語は、「specification」(仕様)の略称として使われることがあります。テストコードは、プログラムの機能や振る舞いが正しく動作するかどうかを確認するために書かれるものであり、そのプログラムの仕様に基づいて動作するべきものです。そのため、テストコードはプログラムの仕様を具体的に表現する一部と考えることができます。このような背景から、「spec」という用語はテストコードやテストスイートを指すのに使用されることがあります。
チェック機能と言いながら、それが自体が仕様を表現しているということらしい。(へー)
RSpecはフレームワーク?
「Rubyの中で、もう一つのフレームワークが動いている」ということを意識すると理解しやすい(らしい)
メソッド関係
spec/rails_helper.rb
- Railsのテストをするときの共通の設定を書いておくファイル。
- テストファイルは、
require 'rails_helper'
でこのファイルを読みにいく。
describe
メソッド- テストコードのグループ分け
- describe: 記述する
- 入れ子(nest)にして、機能ごとに記述。
it
メソッドdescribe
と同じでグループを作る。- その一つ一つを
example
と呼ぶ。(個別にテストする'事例'的な?)
bundle exec
% bundle exec rspec spec/models/user_spec.rb
valid?
メソッド- テストコード内の任意のタイミングで
validates
を実行できるメソッド。true
かfalse
を返すfalse
の場合はエラーメッセージを生成する
(valid?
があって初めてerrors
メソッドが使える)
- テストコード内の任意のタイミングで
expectation
: 期待、想定- 想定通り動くかの確認 = '想定する挙動' + 'アプリの挙動'
- 雛形
expect().to matcher()
matcher
=include
(包含する) oreq
(=equal: 等しい)expect
の引数と'match'してるか確認できる
errors
メソッド- エラー内容を確認できる。
full_messages
= ’エラーメッセージ'を'配列'として返す
#user = User.new(nickname: '') [4] pry(main)> user.errors => <ActiveModel::Errors [#<ActiveModel::Error attribute=nickname, type=blank, options={}>]>
#user = User.new(nickname: '') [6] pry(main)> user.errors.full_messages => ["Nickname can't be blank"]
英単語
factory: 作る(facio)場所(-orium) -> 工場、製造所、製作所
- factor: factus(作った)+-tor(~するもの) -> 要因、因数
- fact: 実際にした(factus)こと -> 事実、真相、現実
- affect: ~へ(ad-)作り出す(facio)、~へ作用する -> に作用する、を感動させる
- effect: 作り(fectus)出した(ex-)、作り出した結果 -> 効果、結果、影響
- defect: 不完全に(de-)作られた(fectus)こと -> 欠陥、短所、欠点
instance: 上に(in-)立っ(sto)ている(-ans)こと(-ia)、近くに存在すること -> 例、場合、出来事
- substance: 下に(sub-)立っ(sto)ていること(-ance)、根っこにあること -> 物質、重要性、実質
- circumstance: 周囲に(circum)立っ(sto)ていること(-ance) -> 周囲の事情、環境、状況
- distance: 離れて(dis-)立っ(sto)ていること(-antia) -> 距離、離れた場所
- obstacle: 前に(ob-)立つ(sto)道具(-culum)、邪魔なもの -> 障害物、妨害物、邪魔
confirm: 完全に(con-)堅固にする(firmo)こと -> 確かめる、承認する
- affirm: 支持する、断言する
- firm: 堅い(firmus)こと -> 堅い、頑丈な、断固とした
- firm: 取引を堅固(firmus)にするために文書に署名した屋号 -> 商会、会社、事務所
execute: 外まで(ex-)付いていく(sequor)、最後までやり通す、遂行する -> を実行する、を施行する、を処刑する
- exective: 外まで(ex-)付いていっ(sequor)ている(-ivus)、最期までやり通している、遂行している -> 役員、実行する、行政の
- suit: sequor(後を追う) -> ぴったりと(sequor)あった服、罪の追求(sequor) -> スーツ、訴訟、適合するもの、似合う、服を着せる
- second: 最初の数の後に続い(sequor)ている(-undus)数 -> 第二の
- second: 第一の時間の小さな単位 [minute] に続く第二の(secunda)小さな(minutus)単位(pars) -> 秒、瞬間、一刻
- persue: 前にあるものを(pro-)追い掛ける(sequor)こと -> 追跡する
- persuit: 追撃
- sequence: 続い(sequor)ている(-ens)こと(-ia) -> 連続、数列、順序
- sequel: 続編
- consequent: 一緒に(com-)後から続い(sequor)ている(-ens)こと -> 結果として生じる、当然の
- subsequent: 下に(sub-)続い(sequor)ている(-ens)こと -> 次の、後続の
まとめ
- テストの基本は、
expect().to matcher()
- これを
example
単位で書いていく it〜end
とかdescribe〜end
とかでグループ化
- これを
- エラーメッセージを含むときは
include
、同じ時はeq
- 手が止まったら、コンソールとか
binding.pry
で状況確認。