みやちゃ
この記事は、こちらの記事の続きとなります。
使用するテストファイルなどは、前回のままとなるので、先に前回の記事を読んでからの方がわかりやすいと思います!
前回は、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日間の返金保証付きなので、いつでも返金できます。