Upgrade to Pro — share decks privately, control downloads, hide ads and more …

私のRSpecの書き方 / How I write RSpec

私のRSpecの書き方 / How I write RSpec

とみたまさひろ

March 25, 2024
Tweet

More Decks by とみたまさひろ

Other Decks in Technology

Transcript

  1. ひとつの it に複数の expect を書いてもいい describe HogeClass do
 it '〇〇となる'

    do
 expect(...).to eq hoge expect(...).to eq hoge expect(...).to eq hoge
 end
 end
 その方が速いしね
  2. expect に依存関係なければ aggregate_failures で括ると便利 describe HogeClass do
 it '〇〇となる' do


    aggregate_failures do
 expect(...).to eq hoge # ここで失敗しても
 expect(...).to eq hoge # これ以降も評価してくれる
 expect(...).to eq hoge
 end
 end
 end

  3. 異常系を追加 describe HogeClass do
 it '〇〇となる' do
 ...
 end
 it

    '〇〇の場合エラーとなる' do
 expect { ... }.to raise_error ErrorClass, "message"
 end
 end
 「〇〇の場合」の結果がひとつなら context は書かない
  4. 複数の it を含む場合に context describe HogeClass do
 context '〇〇の場合' do


    it '□□となる' do
 ...
 end
 it '△△となる' do
 ...
 end
 end
 end

  5. 複数の it で前処理が共通なら before に切り出してもいい describe HogeClass do
 context '〇〇の場合'

    do
 before { ... }
 it '□□となる' do
 ...
 end
 it '△△となる' do
 ...
 end
 end
 end
 別に切り出さなくてもいいけど、同じなのか異なるのかわかりやす くなってた方がいい
  6. マッチャむずい 多くて覚えられない be, eq, eql, equal, be ==, be >,

    be >=, be <=, be <, be_between, match, be_within, start_within().of(), start_with, end_with, be_instance_of, be_kind_of, respond_to, be_truthy, be_falsey, be_nil, exist, include, match_array, contain_exactly, cover, change().from().to(), change().by(), change().by_at_least(), change().by_at_most(), satisfy, output().to_stdout, output().to_stderr, raise_error, throw_symbol, yield_control, yield_with_no_args, yield_with_args, yield_successive_args, ... あとむりやり英語っぽくしててちょっとキモい
  7. エラー時に途中の状態を表示してくれる 最近プライベートで書くコードはもっぱら power_assert 
 Failure/Error: is_asserted_by { hoge.upcase.reverse == 'ABCDEFG'

    }
 
 is_asserted_by { hoge.upcase.reverse == 'ABCDEFG' }
 | | | |
 | | | false
 | | "GFEDCBA"
 | "ABCDEFG"
 "abcdefg"

  8. 便利なマッチャもある たとえば include は入れ子でも使えて便利 hash = {
 id: 999,
 hoge:

    {
 id: 999,
 fuga: 123
 }
 }
 
 expect(hash).to include(hoge: include(fuga: 123))

  9. でもまあ今ならパターンマッチ使えばいいかも hash = {
 id: 999,
 hoge: {
 id: 999,


    fuga: 123
 }
 }
 
 is_asserted_by { hash in {hoge: {fuga: 123}} }