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

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

 

みやちゃ

 

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

今回は前回の記事の続きです!

こちらの記事はPart.10です!

Part.1から見れば、Railsアプリケーションの作成からRspec導入、テストの書き方の一連の流れを確かめられるので、ぜひご覧ください!

Part.1「Rspecの導入から動作確認までを徹底解説」

Part.2「Rails6でRspecのテストを書く」

Part.3「Rails6にてRspecでUserモデルのテストの書き方」

Part.4「Rails6にてRspecでUserモデルのテストの書き方2」

Part.5「Rspecのテストで作成したデータベースはどうなるのか?」

Part.6「FactoryBot導入からデータベース作成まで」

Part.7「FactoryBotで複数のデータベースを一気に作成」

Part.8「Controllerのテストの書き方(request specの書き方)」

Part.9「Controllerのテストの書き方(request specの書き方)2」

目次

前回までの復習

それではcreateアクションのテストを書いていきましょう!

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

これにCreateアクションのテストを追加していきます。

テストの説明

Createアクションのテストは2つのexampleを作成します。

それぞれの内容は

・ログインしたユーザーでPostを作成できるか

・ログインしていないユーザーで適切な処理がされるか

です。

それでは順にやっていきましょう。

Createアクションのテスト

・ログインしたユーザーでPostを作成できるか

まずはログインしたユーザーでちゃんとPostが作成できるかをテストします。

「posts_request.rb」ファイルを開いて、以下の記述を追加してください。

    context "create" do
        it "access by user" do
          sign_in @user
          post "/posts", :params => { :post => { :title => "test", :body => "test", :user_id => 1}}
          expect(response).to have_http_status(200)
        end
    end

sign_in @userでログインしています。

「post "/posts"」というURLでリクエストを通します。

その際に、パラメータとして、カラムの情報を与えてあげています。

そしてそれらの結果、「have_http_status(200)」でHTTPリクエストが200であるという予想を立てています。

HTTPリクエストが200は、リクエストが成功したことを示します。

・ログインしていないユーザーで適切な処理がされるか

次はログインしていないユーザー(ゲスト)がリクエストしたときのテストを書きましょう。

以下の記述を追加してください。

    context "create" do
        it "access by user" do
          sign_in @user
          post "/posts", :params => { :post => { :title => "test", :body => "test", :user_id => 1}}
          expect(response).to have_http_status(200)
        end
        it "access by guest" do
          post "/posts"
          expect(response).to have_http_status(401)
        end
    end  

今度は見ての通り、sign_in @userの記述が無くなっています。

ゲストの状態で、「post "/posts"」のリクエストをしてもエラーになるはずです。

HTTPリクエストの401は、未認証であることを示します。

テストの実行

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

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

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

実行結果は、

Running via Spring preloader in process 5136

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

Finished in 0.40395 seconds (files took 0.56838 seconds to load)
5 examples, 0 failures

テストが通りましたね。

成功です。

まとめ

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

今回は、Createアクションのテストを書きました!

 

みやちゃ

 

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

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

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

まで解説しています。

Udemyの教材へ

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

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

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

Udemyの教材へ

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

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

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

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