Rspecを書くときの自分なりの決まり事、というかこうした方が読みやすくなるんではなかろうかということをメモがわりに書いてく。これからもちょいちょい足していく & これ違うなと思う部分は修正していく。
戻り値を明確にする
let!(:hoge) do
huga = create(:hoge, name: 'name', user: user)
hoge.update(updated_at: Date.new(2018, 7, 1))
hoge # 戻り値
end
最後のhogeがなく、hoge.updateで終わってしまうと戻り値が何なのかが判断しづらいので「hoge」を最後に記述し戻り値を明確にする
凡庸的なクラス属性を指定するときは「within(’.someClass’) do」を使い対象を絞る
page.all('.btn')[1].click
# 対象が広すぎるのでページに新いbtnクラスが追加されたときにテストが通らなくなる恐れがある
within(page.all('.shops')[1]) { page.all('.btn')[1].click }
# withinで対象となる範囲を狭くすることで対象が明確になり後に不具合が起きにくくなる
適切な箇所に空行を入れ可読性を良くする
describe 'hogehoge' do
let(:super_admin) { create(:super_admin) }
let(:hoge) { create(:hoge) }
# 空行
before do
as_page_domain
login_as super_admin, scope: :admin
visit hoge_path
end
# 空行
specify 'hugahuga' do
fill_in :text, with: 'test'
# 空行
expect {
click_button('保存する')
}.to change(Fuga, :count).by(1)
# 空行
expect(page.body).to have_content '登録しました'
end
end
値をセットする部分やチェックする部分の間に空行を入れて構造的に見やすくするとコードがリーダブルになる
ヒアドキュメントにクォーテションは要らない
tsv_text = <<~"TSV_TEXT"
shop_id
#{shop_1.id}
TSV_TEXT
# クォーテションを使わなくても書ける
tsv_text = <<~TSV_TEXT
shop_id
#shop_1.id}
TSV_TEXT
テストデータを作るとき画面操作をわざわざする必要はない
# 画面操作そのものをテストするわけではないのにseleniumを経由するとそれだけ遅くなる
before do
tsv_text = <<~"TSV_TEXT"
shop_id
#{shop_1.id}
TSV_TEXT
fill_in :shop_item_tsv_text, with: tsv_text
click_button('保存する')
end
# 事前に必要なデータであれば let, beforeで最初に作成しておく
before do
ShopItem.create(shop: shop_1)
end
データのreloadは独立させて書く
# リロードとデータの検証を同時にしてしまっているので読みにくい
expect(hoge.reload.position).to eq prev_hoge_position
# reloadと検証を別々にする(reloadとexpectはセットのようなものなので間に空行入れない)
hoge.reload
expect(hoge.position).to eq prev_hoge_position