😃

RspecのRequest specをDRY原則で書いてみよう

2021/06/07に公開

はじめに

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でそれを呼び出すと言ったものです。

詳しい説明は下記に記事を貼るのでそこから参照してください!

参考にした記事

https://railsguides.jp/testing.html#コントローラの機能テスト

http://samurai.ataglance.jp/rspec_shared_examples/

Discussion