search
LoginSignup
0

posted at

updated at

Rspecを書くときに注意していること

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

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
What you can do with signing up
0