Ruby on Rails プログラミング 日記投稿サービスを1から作る

【Rspec入門#8】Controllerのテストの書き方(request specの書き方)

 

みやちゃ

 

皆さんこんにちは、みやちゃです!

こちらの記事でRspecのテストの書き方を詳しく解説しています。

みなさんはControllerのテストを書いたことがありますか?

ちゃんとパスが通るのか、リクエストが通るのかのテストは重要になってきます。

今回は
  • Rspecでのcontrollerのテストについて
  • request spec
  • newアクションのテスト
この記事を読むと

newアクションのテストが書けるようになります!

目次

RspecでのControllerのテストについて

Rails4までは、Controllerのテストはcontroller specで書かれていたのですが、Rails5からは「request spec」で書くことが推奨されています。

参考:https://rspec.info/ja/blog/2016/07/rspec-3-5-has-been-released/

request specでは、URLのリクエストがちゃんと通るかを主にテストしていきます。

Postモデルのrequest specを書く

それでは実際にPost Controllerのテストを書いていきましょう。

specフォルダの下に、requestsフォルダを作成します。

requestsフォルダの下に、「posts_request.rb」ファイルを作成します。

このファイルを開き、以下のように記述してください。

require 'rails_helper'

RSpec.describe "Posts", type: :request do
  describe "[Action test]" do
    before do
      @user = FactoryBot.create(:user, :a)
    end
  end
end

まだ何もテストは書いていませんが、"[Action test]"という名前のdescribeのグループを作りました。

さらに、テストではUserが必要になるので、beforeの中で、FactoryBotを使ってUserを作成し、@userというインスタンス変数に格納しています。

FactoryBotについてこちらの記事でインストール方法や使い方など詳しく解説しているので、ぜひご覧ください。

(:user, :a)の「:a」って何?

という方はこちらの記事で解説しているので、ぜひご覧ください。

簡単に言うと、事前に複数記述していたデータベースのうち、1つ目のユーザーのデータベースを作成しています。

Newアクションのテスト

それではまず、Newアクションのテストを書いていきます。

ログインしたUserの場合と、ログインしていないUserとの2パターンのテストを書く必要があります。

まずはログインしているUserがリクエストした時のテストを書いていきます。

posts_request.rbファイルに以下のような記述を追加してください。

require 'rails_helper'

RSpec.describe "Posts", type: :request do
  describe "[Action test]" do
    before do
      @user = FactoryBot.create(:user, :a)
    end

    context "new" do
      it "access by user" do
        sign_in @user
        get '/posts/new'
        expect(response).to be_successful
      end
    end
  end
end

"new"という名前のcontextグループを作って、その中に、"access by user"という名前のexampleを作成しています。

1行目の「sign_in @user」は見ての通り、@userに格納されたUserで、sign_inしています。

2行目の「get '/posts/new'」はリクエストを通して、

3行目で、「response」が「be_successful」になるかどうかをチェックしています。

それではテストを実行してみましょう。

ターミナルを開いて、以下のコマンドを実行してください。

rspec_sample miyacha$ bin/rspec spec/requests/posts_request.rb

実行結果は、

Running via Spring preloader in process 28957

Posts
  [Action test]
    new
      accese by user (FAILED - 1)

Failures:

  1) Posts [Action test] new accese by user
     Failure/Error: sign_in @user
     
     NoMethodError:
       undefined method `sign_in' for #<RSpec::ExampleGroups::Posts::ActionTest::New:0x00007fe3e85464a0>
     # ./spec/requests/posts_request.rb:10:in `block (4 levels) in <main>'
     # -e:1:in `<main>'

Finished in 0.09944 seconds (files took 0.88086 seconds to load)
1 examples, 1 failure

Failed examples:

rspec ./spec/requests/posts_request.rb:9 # Posts [Action test] new accese by user

なんとエラーが出てしまいました。

'sign_in'は使えないと怒られてしまいましたね。

「sign_in」はdeviseのメソッドなので、テストファイルでもdeviseのhelperが呼び出せるように、設定しましょう。

spec/rails_helper.rbファイルを開いてください。

以下の一文を追加してください。

RSpec.configure do |config|
  ...他の行は省略
  config.include Devise::Test::IntegrationHelpers, type: :request
end

この一文を追加することで、deviseのhelperがテストファイルでも呼び出せるようになったはずです。

もう一度テストを実行してみましょう。

ターミナルを開いて、以下のコマンドを実行してください。

rspec_sample miyacha$ bin/rspec spec/requests/posts_request.rb

実行結果は、

Running via Spring preloader in process 29076

Posts
  [Action test]
    new
      accese by user

Finished in 4.78 seconds (files took 0.64853 seconds to load)
1 examples, 0 failures

今度はテストが通ったみたいですね。

長くなったので、続きは次回で!

まとめ

いかがでしたでしょうか?

今回は、request specでnewアクションのテストを書いていきました!

 

みやちゃ

 

ここまでご覧いただきありがとうございます!

こちら のUdemyの動画教材は、8時間で、

  • Dockerで仮想環境構築
  • Railsの基礎を解説しながら、アプリケーション開発
  • RSpecでテストを記述

まで解説しています。

Udemyの教材へ

Railsエンジニアとして働くために必要な、DockerとRSpecを同時に解説してくれています。

DockerとRSpecを使って作ったポートフォリオはかなり評価が高くなります。

ぜひ動画を見てみてはいかがでしょうか?

Udemyの教材へ

受講生は、5000人以上!です。

さらに、Udemyは、30日間の返金保証付きなので、いつでも返金できます。

たったの8時間でDocker、Rails、Rspecを学ぶ即戦力Railsエンジニア養成講座

© 2024 とあるエンジニアの備忘録ブログ Powered by AFFINGER5