gotoshin

主に学んだ事の自分メモ用です。記事に書くまでも無いような事はhttps://scrapbox.io/study-diary/に書いてます。

RSpecを使ってコントローラで簡単にテストやってみた

参考にした記事

使えるRSpec入門・その1「RSpecの基本的な構文や便利な機能を理解する」 - Qiita

RailsじゃないRspec3環境を構築する方法 - Qiita

初期化

Gemをinstall & 初期化する

  • Gemfileにrspecを追加
group :development, :test do
 gem "rspec-rails"
end
  • 初期化
bundle exec rails generate rspec:install

rspec自体を初期化

以下の記事を参考に。

RailsじゃないRspec3環境を構築する方法 - Qiita

テスト用のファイルを作成する

初めてRSpecでRailsアプリのコントローラーをテストする - Qiita

rails g rspec:controller books
  • 上のコマンドを打つことで、specフォルダ内にcontrollersフォルダが作成され、 その中に、books_controller_spec.rbが作成されます。

テストを書いてみる

テスト対象のcontoroller

  def index
    @books = Book.where(is_readed: params[:is_readed]).where(uid: params[:uid]).where(test: params[:uid])
    render json: @books, status: :ok
  end
  • whereでデータを取ってくるだけのシンプルな処理です

テストを書いてみる

以下の記事を参考にAPIステータスコードで判断する簡単なテストを書いてみました。

【Rails】APIテストの書き方 - Qiita

spec/controllers/books_controller_spec.rb

require 'rails_helper'

RSpec.describe BooksController, type: :controller do
  describe "#index" do
    # 正常なレスポンスか?
    it "responds successfully" do
      get :index, params: {is_readed: false, uid: 'XXXXX'}
      expect(response.status).to eq(200)
    end
  end
end
解説
get :index, params: {is_readed: false, uid: 'XXXXX'}
  • getindexメソッドを呼び出し、is_readed: false, uid: 'XXXXX'をparamsに入れている
expect(response.status).to eq(200)
  • responseには上記のメソッドで返ってきたレスポンスが入っている。今回はステータスを取り出している
  • eq(200)で取り出したステータスが200か確認

実行してみる

docker-compose run web rspec

テスト成功パターン

f:id:hatehate-nazenaze:20200802164819p:plain

テスト失敗パターン

f:id:hatehate-nazenaze:20200802165105p:plain 失敗するとこんな風に失敗した箇所が表示される

感想

これまでテストってどんなものか記事をみてふーんとか思ってたけど、やってみるのが一番感覚掴めて良いと思った。

あと、ステータスコードレベルでのテストなら、そんなに手間は掛からないんだな〜と思った。

もちろんその分効果は薄いし、もう少し細かくやると色々と手間が増えるんだろうけど。