2017-02-14 2 views
0

後にテンプレートをチェックし、私のユーザーのためのアクションを作成します:RSpecのは、ここでは、リダイレクト

def create 
     @user = User.new(user_params) 

     if @user.save 
      respond_to do |format| 
       format.html { 
        redirect_to edit_admin_user_path(@user) 
        flash[:success] = "Successfully created" 
       } 
      end 
     else 
      render :new 
      flash[:alert] = "Something went wrong" 
     end 
    end 
私のテストはこのように見ている

:私はこのエラーを取得していますが

context "POST methods" do 

    describe "#create" do 
     it "renders the edit template" do 
      post :create, user: FactoryGirl.attributes_for(:user) 
      expect(response).to render_template(:edit) 
     end 
    end 
end 

ユーザーの作成後にedit.html.hamlファイルがレンダリングされているかどうかを確認します。私は間違って何をしていますか?私は別のテストにリダイレクトするためにチェックします

アップデート#1 が、これは私の完全なテストスイートである:私が欲しいもの

require 'rails_helper' 

RSpec.describe Admin::UsersController, type: :controller do 

    render_views  

    context "POST methods" do 

     describe "#create" do 
      it "using valid params" do 

       expect{ 
        post :create, user: { email: "[email protected]", password: "long12345678" } 
        }.to change(User, :count).by(1) 
       # get user_path('1') 
      end 

      it "redirects to the edit page after saving" do 
       post :create, user: FactoryGirl.attributes_for(:user) 
       user = User.last 
       expect(response).to redirect_to(edit_admin_user_path(user.id)) 
      end 

      it "renders the edit template" do 
       post :create, user: FactoryGirl.attributes_for(:user) 
       user = User.last 
       expect { 
        redirect_to(edit_admin_user_path(user.id)) 
       }.to render_template(:edit) 
      end 

      context "it redirects to new" do 
       it "if user has no valid mail" do 
        post :create, user: { email: "something", password: "long12345678" } 
        expect(response).to render_template(:new) 
       end 
       it "if user has no valid password" do 
        post :create, user: { email: "[email protected]", password: "short" } 
        expect(response).to render_template(:new) 
       end 
      end 
     end 
    end 
end 

は編集テンプレートがレンダリングされている場合、実際に確認することです。 expect(response).to redirect_to(edit_admin_user_path(user))の場合はではないので、のテンプレートをチェックしてください。 edit.html.hamlファイルがまったくなくてもこのテストに合格します。

+0

その* edit.html.haml *が存在することを確認するには、 'edit'アクションではなく、' create'アクションのテストを記述する必要があります。 –

答えて

1

createの操作をテストするときは、リダイレクトの正しさを確認するだけです。このアクションでは、実際にeditテンプレートをレンダリングしていませんが、作成したエンティティのパスeditにリダイレクトするだけです。これはあなたがチェックすべきことです。

describe "#create" do 
    it "redirects to the edit path" do 
     post :create, user: FactoryGirl.attributes_for(:user) 
     expect(response).to redirect_to(edit_admin_user_path(User.last)) 
    end 
end 

次に、あなたがテンプレートのレンダリングをチェックしているedit行動のための別のテストを、持っている必要があります。つまり、作成アクションでリダイレクトした後も適切なテンプレートが表示されます。

+0

私の質問が更新されました。私は既に明示的なリダイレクトをチェックしています。しかし、edit.html.hamlファイルがまったくなくても、このテストは成功します。 – mohnstrudel

+1

@mohnstrudel、私はあなたが懐疑的だと思う。 'create'アクションをテストするときは、リダイレクトの正当性をチェックするだけです。次に、テンプレートのレンダリングをチェックしている 'edit'アクションの別のテストが必要です。つまり、 'create'アクションでリダイレクトした後に適切なテンプレートも表示されます。 – ktaras

+0

偉大な、ありがとう!私の論理におけるこの欠陥は確かに事実でした。 'context" GETメソッド "do let(:user){FactoryGirl.build(:user)} let(:created_user){FactoryGirl.create(:user)}このテストを今すぐ実行しています。 } は "#editは" それは 得るのですか "編集テンプレートがレンダリング" を行う説明:編集、IDを:(:新) 終了 エンド end' あなたでし はrender_template .TO(レスポンス)が期待created_user.id私はそれを受け入れることができるように初期の答えを変更することを検討? – mohnstrudel

0

コントローラーの操作でユーザーを正常に保存した後、edit_admin_user_pathにリダイレクトされています。しかし、代わりにrenderをテストしています。

以下のようにテストを更新してください。

context "POST methods" do 

describe "#create" do 
    before(:each) do 
    @user = FactoryGirl.attributes_for(:user) 
    end 
    it "renders the edit template" do 
    post :create, user: @user 
     expect(response).to redirect_to(edit_admin_user_path(@user)) 
    end 
    end 
end 
+0

私はすでにこのテストをしていますが、編集テンプレートが存在するかどうかはチェックしません。意味、私が_no_ edit.html.hamlを持っているとき、このテストはまだ通ります。 私はこのコードを試してみました:作成、ユーザー::FactoryGirl.attributes_for(:ユーザー) \t \t \t \tユーザー= User.last \t \t \t \t期待 'それは \t \t \t \tポストがない "編集テンプレートをレンダリングします" { \t \t \t \t \t redirect_to(edit_admin_user_path(user.id))\t \t \t \t(編集)render_template .TO} \t \t \t end' が、これはエラーにつながる:(テンプレート照合「編集」をレンダリング) 'あなたが提供マッチャーを使用するために、引数ではなく、ブロックを渡す必要があります、またはmatcherは 'supports_block_expectations?'を実装する必要があります。 – mohnstrudel

関連する問題