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"
とする
- テスト時にシナリオ指定する場合は RSpec 実行時に
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