みやちゃ
皆さんこんにちは、みやちゃです!
こちらの記事で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日間の返金保証付きなので、いつでも返金できます。