RspecのRequest specをDRY原則で書いてみよう
はじめに
Rspecを書き始めたばかりなのであまり詳しいことはかけませんが自分の備忘録として書いているので間違えている部分等あれば教えていただけると幸いです。
そもそもRequest specってなに?
もともとRailsのcontrollerをテストする際にはRails4までのバーションだとController specが用いられてましたがRails5以降になるとそれらが非推奨となりRequest specで書くことが推奨されるようになりました。
要するにcontollerに書くテストを書けばいい!!と私は思います
Railsガイドによるとコントローラの機能テストは
以下引用
Webリクエストが成功したか
正しいページにリダイレクトされたか
ユーザ認証が成功したか
レスポンスのテンプレートに正しいオブジェクトが保存されたか
ビューに表示されたメッセージは適切か
このようになっています。上記を参考にRequest specを書いていきましょう
本題
それでは上記を参考にDRYなコードを書いていきましょう!!
待った!!DRYってなに!?!?
ってなった方もいると思います。僕もそうでした。
DRYというのはDRY原則と言いましてWebフレームワークRuby on Railsが基本理念としの一つとして採用している開発原則です。簡単にいうとコードを重複させないという意味です。
難しい事はここでは省きますがrequest specを下記に書いていくのでそこで雰囲気だけ掴んでいってください!
例1 HTTPレスポンスコードが200かどうかを判定する場合
require 'rails_helper'
Rspec.describe 'Qiita', type: :request do
describe 'GET Qiita index' do
it 'statusが200であること'
get qiita_path
expect(response).to have_http_status(200)
end
end
describe 'GET Qiita new' do
it 'statusが200であること' do
get new_qiita_path
expect(response).to have_http_status(200)
end
end
例ですが上記のようなコードがあった場合、indexとnewで重複している場所があります。
このような場合にDRYに書くことができます。
DRYに書いた場合
require 'rails_helper'
shared_examples 'statusが200であること' do
it 'statusが200であること' do
expect(response).to have_http_status(200)
end
end
Rspec.describe 'Qiita', type: :request do
describe 'GET Qiita index' do
get qiita_path
it_behaves_like 'statusが200であること'
end
describe 'GET Qiita new' do
get new_qiita_path
it_behaves_like 'statusが200であること'
end
end
これだけで圧倒的にみやすくなりました。ここででできたshared_examplesとit_behaves_likeは何かというとshared_examplesを利用してコードを共有しit_behaves_likeでそれを呼び出すと言ったものです。
詳しい説明は下記に記事を貼るのでそこから参照してください!
参考にした記事
Discussion