[Rails5]　Rspec -render&redirect_to-編

#はじめに
初投稿になります。昨年より独学にてRailsを学習しておりまして、このたび知識定着の為Qiitaに学習記録を乗せて行こうと思いますので誤った認識等ございましたらご指摘頂ければ助かります。

さて早速本題ですがRspeを学習しておりまして**『構文は分かったけど何て書けばいいのか分からない！』**と躓いてしまいました。恐らく一つ一つ慣れていくしか無いとは思うのですが、折角投稿するのでしらみ潰しに色んなパターンのRspecを書いて行こうと思います、まず当投稿では一番理解し易いであろう**render&redirect_toのRspec**について学習しましたので纏めたいと思います。

# １. 前提条件
まず前提条件として下記の様な環境下で行います、

**Rails 5.0.0.1**
**Ruby 2.4.5**
**Docker**
**Docker-compose**

#２. テスト対象
テスト対象はGroupControllerのcreateアクションと仮定します

```Ruby
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
```   

上記の様なソースコードがあったとして

**　１.「もし@groupがsaveされた時はマイページへリダイレクトされる事」**
**　2.「そうでない場合newページへレンダリングされる事」**

と言った様な処理をテストしていきます。


#3 .Rspecテスト実装
下記の様にspecを実装していきます

```Ruby
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的なものなのか・・また調べます。

#４. テスト結果

```Ruby
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.まとめ
以上の事を踏まえて、

```Ruby
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
```


として、テストを走らせると

```Ruby
GroupsController
  POST #create
    @groupがsaveされた場合
      マイページへリダイレクトされる事
  POST #create
    @groupのsaveに失敗した場合
      falseが返される事
      newテンプレートにレンダリングされる事

```

成功しました。

正直本質的に理解出来ていない箇所も多々ありますのでご指摘頂ければ幸いです

最後までお付き合い頂きましてありがとうございました。