LoginSignup
0
0

More than 3 years have passed since last update.

[Rails5] Rspec -render&redirect_to-編

Posted at

はじめに

初投稿になります。昨年より独学にて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
    @groupsaveされた場合
      マイページへリダイレクトされる事
  POST #create
    @groupsaveに失敗した場合
      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
    @groupsaveされた場合
      マイページへリダイレクトされる事
  POST #create
    @groupsaveに失敗した場合
      falseが返される事
      newテンプレートにレンダリングされる事

成功しました。

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

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

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0