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 のメリット
      • テスト対象が明確化される
      • ひとつのテストにひとつのアサートがほぼ強制される
  • #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 方面の掘削もできるのかどうか。