RSpec

テストコードで知ったこと(ruby + RSpec)

特にレビューを依頼する前に、×になっている場合は自分のコードに原因がないか確認してから依頼してください

  • 分岐する全てのパターンをテストコードにする

  • テスト対象になっている、関数の引数もテスト対象

  • いつも使うモックや変数は、let を使って共通化

  • いつも実行する処理は、before で共通化

  • いつも実行するテスト開始処理は、subjectで共通化

  • 分岐する所で、通らない方の関数が呼ばれているか確認する

  • モック化した変数名は、????_mock にするとわかりやすい

  • allow しないと expect が使えない

  • doubleで作られたオブジェクトは、allow しなくても、expectが使える

  • mockにする方法は、doubleを使う

  • itブロックAが、mock経由で複数関数を経由して呼んでいる。 itブロックBが、Aと同じ複数関数をreceive_message_chainで呼んでいる。 この場合は、itブロックAをbeforeでまとめる。 itブロックBは、Aに合わせて書き直す

  • テスト対象のコード通りに書くとわかりやすい

  • when とか if といった条件は、context で切ろう。

  • it から続くものは、subject を実行したときにどういう挙動になるかを書こう。

  • context で切った中で、その条件を満たすための準備は before で書けるとなおよい

RSpec.describe テストしたいクラス名, ???? do describe '関数名' do let(:生成したいオブジェクト名) { オブジェクトを生成する処理 }   before do #ここに 各 context で共通したい処理を入れる allow(オブジェクト).to receive(関数名).and_return(返したい値) end context '関数に入力する内容' do it 'テストが通ることを期待する内容' do #ここにテストする具体的な内容を書く end end end end

フィーチャーテスト

ブラウザを使った操作(検索ボックスでテキスト入力等)をするためのテストのこと。

テストの作り方

フィーチャーテスト例:

  • フィーチャーテスト名は 'HogeHoge Search by Javascript'
  • backgroud ではテスト前に実行する内容を記載する(例ではテスト用データを作成している)
  • scenario でテストのシナリオを記載する
    • テスト時にシナリオ指定する場合は RSpec 実行時に -e "HogeHoge Search by Javascript" とする
  • visit によりブラウズするページを指定する
  • find で DOM ツリーを検索
  • .set で値を設定する。
feature 'HogeHoge Search by Javascript' do background(:each) do FactoryGirl.create(:hoge_hoge, fuga: FactoryGirl.create(:fuga, fuga_code: 1001)) FactoryGirl.create(:hoge_hoge, fuga: FactoryGirl.create(:fuga, fuga_code: 1010)) end scenario 'Fuga Code 1001 で検索して、1001 の HogeHoge のみ表示されること' do visit hoge_hoges_path find('input[aria-controls="DataTables_Table_0"]').set '1001' expect(page).to have_content '1001' expect(page).to have_no_content '1010' end scenario 'Fuga Code FOO で検索して、1001/1010 の HogeHoge が表示されないこと' do visit hoge_hoges_path find('input[aria-controls="DataTables_Table_0"]').set 'FOO' expect(page).to have_no_content '1001' expect(page).to have_no_content '1010' end end

テストのデバッグのしかた(テストで失敗した時にも有効)

  • save_and_open_page を挿入すると、実行されたタイミングでブラウザに表示された画面が見れる。(下記は例)
    • シナリオ例
scenario 'Fuga Code 1001 で検索して、1001 の Hoge のみ表示されること' do visit hoge_hoges_path save_and_open_page find('input[aria-controls="DataTables_Table_0"]').set '1001' expect(page).to have_content '1001' expect(page).to have_no_content '1010' end