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

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

 

みやちゃ

 

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

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

Rspecが全くわからない方のために、インストールから徹底的に解説しているので、ぜひご覧ください!

この記事は、こちらの記事の続きとなります。

使用するテストファイルなどは、前回のままとなるので、先に前回の記事を読んでからの方がわかりやすいと思います!

前回は、Rspecにおいて、Controllerのテストは、request specで記述するということをお話ししました!

今回は
  • newアクションのテスト(ログインしていないUser)
  • showアクションのテスト
この記事を読むと

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

目次

Newアクションのテスト(ログインしていないUser)

前回の記事では、ログインしているUserがNewアクションのリクエストをした時のテストを書きました。

当然ログインしていないUser(ここではゲストと呼びます)が、Newアクションのリクエストをすることもあるでしょう。

その時、ちゃんと適した動作をしてくれるのかをテストで確認しましょう。

spec/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

    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のグループに、もう1つ"access by guest"という名前のテストを書いていきましょう。

ファイルに以下の記述を追加してください。

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

      it "access by guest" do
        get '/posts/new'
        expect(response).to have_http_status(302)
      end
    end
  end
end

"access by user"のテスト(example)では、sign_in @userで、ログイン手続きをしていますが、今回はゲストでリクエストを送信するので、sign_inしません。

そして、expect(response).to の行で、リクエストを送信した結果の予測を記述します。

「have_http_status」というマッチャを使います。

これは、HTTPリクエストが何かを指定するものです。

例えば、「have_http_status(302)」だったら、HTTPリクエストが302と指定しています。

HTTPリクエストの302は、「リクエストされたURIが一時的に変更された」ことを意味します。

ログインしていないUserがNewアクションをリクエストすると、ログイン画面に移るので、このような記述にしています。

テストの実行

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

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

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

実行結果は、

Running via Spring preloader in process 33056

Posts
  [Action test]
    new
      access by user
      access by guest

Finished in 0.33807 seconds (files took 1.19 seconds to load)
2 examples, 0 failures

ちゃんとテストが通りましたね。

showアクションのテスト

createアクションのテストを解説したいのですが、長くなるので、createアクションは次回の記事で解説します。

showアクションのテストは簡単なので、さっとやってしまいましょう。

spec/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

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

      it "access by guest" do
        get '/posts/new'
        expect(response).to have_http_status(302)
      end
    end

    it "show" do
      post = Post.create(
        title: "test",
        body: "test",
        user_id: "1",
      )
      get post_path(post)
      expect(response).to be_successful
    end
  end
end

"show"という名前のexampleを追加しました。

内容は、postという関数に、作成したPostモデルを格納しています。

リクエストは、newアクションでは、URLでしたが、今回はパスでリクエストしています。

テストの実行

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

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

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

実行結果は、

Running via Spring preloader in process 33143

Posts
  [Action test]
    show
    new
      access by user
      access by guest

Finished in 0.63091 seconds (files took 0.98963 seconds to load)
3 examples, 0 failures

ちゃんとテストが通りましたね。

まとめ

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

今回は、newアクションとshowアクションのテストを書いていきました。

 

みやちゃ

 

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

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

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

まで解説しています。

Udemyの教材へ

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

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

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

Udemyの教材へ

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

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

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

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