rspec メモ
色々見つつメモを列挙。
Rspec ベストプラクティスより
- メソド毎に #describe を使うことから始める
- 引数にはメソド名を指定
- クラスメソドであれば名前の前に . をインスタンスメソドであれば # をつける
- そゆ意味ではいっちゃんトップレベル (?) の #describe の引数はクラス名なのか
- メソド実行パス毎に #context を書く
- 引数には given とか when などを使う
- サンプル一つにつき一つの expectation のみを記述
- サンプルの説明は挙動を表す現在時制の動詞で始める
- it 'creates a new user' do みたく
- spec 実行時には --format documentation で実行するようにしよう
- すべてのブロックで 'do..end' スタイルのブロックを使おう
- 可読性をより向上させるために、すべてのブロックに空行を 1 行入れよう
- トップレベルの #describe では最初と最後に 1 行の空行を入れよう
改めて学ぶ Rspec より
- #describe はテスト対象をあらわし、context はテストする時の状況をあらわす
- メソド毎に #describe というルールには必ずしもこだわらなくても良い
- #describe と #context の概念は非常に重要
- subject を使うことで should のレシーバを省略できる
- subject のメリット
- テスト対象が明確化される
- ひとつのテストにひとつのアサートがほぼ強制される
- subject のメリット
- #describe と #subject のネスト
- 関連オブジェクトの試験を行なうような場合
- its を使う方法もある
- 関連オブジェクトの試験を行なうような場合
- it に渡す文字列は省略可能
- コードのみでテストを表現した方が良い、という見解
- コメントとコードの乖離問題
- カスタムマッチャでメセジを調整する、という手法
- 結論としては it に文字列を使わない、を推奨
- 文字列とテスト内容が DRY ではない、が理由
- let は遅延評価
- つうか let の使い方の例が凄い件 (別途例を引用)
- shared_context て何
- shared_context で共有する context を記述
- include_context を使って共有
- shared_context の引数文字列がキーなのか)
let の使い方の例
ええと、以下な書き方なソレが
describe User, '#admin?' do before do @user = User.new(:name => 'jack') end subject { @user } context 'admin' do before do @user.role = Role.new(:role => :admin) end if { should be_admin } end
Role.new の引数を let で云々というのは凄いな。
describe User, '#admin?' do before do @user = User.new(:name => 'jack') @user.role = Role.new(:role => role) end context 'admin' do let(:role) { :admin } it { should be_admin } end
むむむむ。
別途
Tutorial 方面の掘削もできるのかどうか。