#はじめに
初投稿になります。昨年より独学にてRailsを学習しておりまして、このたび知識定着の為Qiitaに学習記録を乗せて行こうと思いますので誤った認識等ございましたらご指摘頂ければ助かります。
さて早速本題ですがRspeを学習しておりまして**『構文は分かったけど何て書けばいいのか分からない!』と躓いてしまいました。恐らく一つ一つ慣れていくしか無いとは思うのですが、折角投稿するのでしらみ潰しに色んなパターンのRspecを書いて行こうと思います、まず当投稿では一番理解し易いであろうrender&redirect_toのRspec**について学習しましたので纏めたいと思います。
1. 前提条件
まず前提条件として下記の様な環境下で行います、
Rails 5.0.0.1
Ruby 2.4.5
Docker
Docker-compose
#2. テスト対象
テスト対象はGroupControllerのcreateアクションと仮定します
def create
@group = Group.new(group_params)
if @group.save
redirect_to mypage_path, notice:'グループを作成しました'
else
render :new
end
end
private
def group_params
params.require(:group).permit(:name)
end
end
上記の様なソースコードがあったとして
** 1.「もし@groupがsaveされた時はマイページへリダイレクトされる事」**
** 2.「そうでない場合newページへレンダリングされる事」**
と言った様な処理をテストしていきます。
#3 .Rspecテスト実装
下記の様にspecを実装していきます
RSpec.describe GroupsController, type: :controller do
describe 'POST #create' do
context '@groupがsaveされた場合' do
let(:params) do
{ group: {name: 'group'}}
end
it 'マイページへリダイレクトされる事' do
expect(post :create, params: params).to redirect_to(mypage_path)
end
end
end
describe 'POST #create' do
context '@groupのsaveに失敗した場合' do
let(:group) do
( Group.new(name: ''))
end
it 'falseが返される事' do
expect(group.save).to be_falsy
end
it 'newテンプレートにレンダリングされる事' do
expect(response).to render_template :new
end
end
end
end
基本的に、
事前準備(状態を作る)→実際値&期待値
上記のコードで言うと、
1.letにてインスタンス作成
2.expect(期待値)
3.マッチャ→(実際値)
という様な実装を心がけて作りました。また、letは本来インスタンス変数の事前準備に使われますがbeforeとの違いが分かりませんでした。恐らく利便的なものなのかDRY的なものなのか・・また調べます。
#4. テスト結果
GroupsController
POST #create
@groupがsaveされた場合
マイページへリダイレクトされる事
POST #create
@groupのsaveに失敗した場合
falseが返される事
newテンプレートにレンダリングされる事 (FAILED - 1)
"newテンプレートにレンダリングされる事 (FAILED - 1)"
・・・あれ?
レンダリングが引っかかったぞ。
当該エラーを見てみると、
Failure/Error: expect(response).to render_template :new
expecting <"new"> but rendering with <[]>
らしい。何故だと思い調べてみるとどうやら、
『render_templateは'get :new'の様にしないとページ遷移しない』
らしいです。
この辺は理解不足なのでまた纏められたらなと思います。
#5.まとめ
以上の事を踏まえて、
RSpec.describe GroupsController, type: :controller do
describe 'POST #create' do
context '@groupがsaveされた場合' do
let(:params) do
{ group: {name: 'group'}}
end
it 'マイページへリダイレクトされる事' do
expect(post :create, params: params).to redirect_to(mypage_path)
end
end
end
describe 'POST #create' do
context '@groupのsaveに失敗した場合' do
let(:group) do
( Group.new(name: ''))
end
it 'falseが返される事' do
expect(group.save).to be_falsy
end
it 'newテンプレートにレンダリングされる事' do
get :new
expect(response).to render_template(:new)
end
end
end
end
として、テストを走らせると
GroupsController
POST #create
@groupがsaveされた場合
マイページへリダイレクトされる事
POST #create
@groupのsaveに失敗した場合
falseが返される事
newテンプレートにレンダリングされる事
成功しました。
正直本質的に理解出来ていない箇所も多々ありますのでご指摘頂ければ幸いです
最後までお付き合い頂きましてありがとうございました。