2017-10-29 4 views
0

私は最初のRailsアプリケーションを作っているので、おそらくこれは基本的なものです。Railsコントローラのトラブル(統合?)テスト

私のユーザープロファイルでは、ユーザーにタイトルと説明を追加させたいと考えています。私は彼らがUserモデルの属性製とroutes.rbにこれを追加しました:

resources :users do 
    member do 
     post 'update_description' 
    end 
    end 

(まだ書かれていません)と同じ方法で両方の属性を処理します。 TDDを実践するには、ユーザがタイトルを提出すればコントローラがそれをデータベースに保存するというテストを書いてみた。私はそれが統合テストだと思ったが、私は正しい道を得ることができなかった。 (それは統合テストですか?)しかし、リサーチでは、関連するコントローラテストファイルに作業用のpost文を書き込むことができました。ここでは、コントローラのテストがあります:

test "profile submits new title and description successfully" do 
    log_in_as(@user) 
    get :show, id: @user 
    assert_nil @user.title 
    post :update_description, id: @user, params: { title: "Lorem ipsum" } 
    # Next: 
    # @admin.reload.title 
    # assert @admin.title == "Lorem ipsum" 
    # assert_template 'users/show' 
    # Etc. 

    end 

これは、次のエラーが発生します。

ERROR["test_profile_submits_new_title_and_description_successfully", UsersControllerTest, 2017-10-22 21:42:52 -0400] 
test_profile_submits_new_title_and_description_successfully#UsersControllerTest (1508722972.17s) 
ActionView::MissingTemplate:   ActionView::MissingTemplate: Missing template users/update_description, application/update_description with {:locale=>[:en], :formats=>[:html], :variants=>[], :handlers=>[:erb, :builder, :raw, :ruby, :coffee, :jbuilder]}. Searched in: 
      * "/var/lib/gems/2.3.0/gems/web-console-2.0.0.beta3/lib/action_dispatch/templates" 
      * "/home/globewalldesk/startthis/app/views" 
      * "/var/lib/gems/2.3.0/gems/web-console-2.0.0.beta3/app/views" 

      test/controllers/users_controller_test.rb:83:in `block in <class:UsersControllerTest>' 
     test/controllers/users_controller_test.rb:83:in `block in <class:UsersControllerTest>' 

私は、これはRailsがビューファイルを探しているとものを見つけることができないことを意味、私は見ていないことを集めますなぜpost :update_descriptionがビューを探しているのですか...私は、ビューなしで情報をポストすると思っていました(私は、ビューがない場合と同じ方法で動作する同様のルートを持っています)。 update_descriptionの方法はコントローラUsersにあります。私は多くの研究をしましたが、何が間違っているのか分かりません。助けて! TIA。

答えて

1

あなたが書くテストの方法は、統合テストのように見えます。しかし、私は個人的にシステムテストを書くアドバイスをします。ユーザーオブジェクトを更新するだけでupdate_descriptionメンバールートを作成することがわかりますか?必要ない - あなたのUserリソースにはすでにeditupdateのアクションがあるので、そのメンバールートを削除できます。

ワークフローを確認するための統合テストと、アプリのさまざまな部分のやり取りの仕組みシステムチェックはユーザーとのやりとりを目的としていますが、基本的にはユーザーが行うことを確認してブラウザに表示します。また、この手法でテストを書く方がはるかに簡単です(少なくともこのレベルでは)。

だからあなたのシステムのテストは、次のようになります。これにより、ユーザは自分のフォームを送信した後、アプリはuser_path(@user)(ショーページ)にリダイレクトすることを前提としてい

setup do 
    log_in_as(@user) // or what ever code to visit login page and login user 
end 

test "profile submits new title successfully" do 
    visit edit_user_path 

    fill_in "Title", with: "Lorem ipsum" 

    click_on "Save" 

    assert_response :redirect 
    follow_redirect! 
    assert_select "Title", text: "Lorem ipsum" 
end 

。私はこれをテストしていないと私はカピバラやその他のツールを使用しますが、ないMinitest -

test "profile submits new title successfully" do 
    log_in_as(@user) // or what ever code to login user 
    get "/user/#{@user.id}/edit" 
    assert_response :success 

    updated_title = "Lorem ipsum" 

    patch :update, user: { id: @user.id, title: updated_title } 

    assert_response :redirect 
    follow_redirect! 
    assert_response :success 
    assert_select "Title", text: "Lorem ipsum" 
end 

注:

と統合テストでは、次のようになります。しかし、この単純なことで私はうまくいくはずです。

チェックdocsあなたはまだ...

+0

はうわー、私はJavaScriptのテストを行うことについて多くのオンライン日の最後のカップルを探していたことを行ってhaventは場合。私が聞いたテストフレームワークの1つはCapybaraでした。リンク先のRails Guidesページには、「システムテストではCapybaraをベースに使用しています。それが私が使用しているRails 4.2.2に当てはまるかどうか分かりますか?とにかく、私は少なくとも統合テストのためにあなたのソリューションを試してみるつもりです。システムテストは、すぐに学べるようなものです。ありがとう! – globewalldesk

+0

それでは、 'Users#edit'に頼るのではなく' update_description'ルートを作ってしまう問題があります。ユーザ編集ページ( 'users//edit'にある)は、名前とパスワードを持っています。プロフィールページは 'users/'にあります。私は、タイトル、説明、およびメッセージを受け取るようなプロファイルyタイプの情報をユーザーが追加できるようにしたいと考えています。だから私は...それらは 'User'プロパティだと分かりました。しかし、私は既にユーザ名とパスワード情報を扱う 'edit'アクションを持っています。だから、私はちょうどユーザー情報の編集を処理するための新しいルートを作成します。 良いソリューションはありますか? – globewalldesk

+0

助けてくれてありがとう。私は2つのことが間違っている。まず、統合テストで、間違った 'post'行を使用していました。これはうまくいきました: 'post" /users/#{@non_admin.id}/update_description "、 params:{タイトル:"私は絶え間ない悲しみの男です " } ' もう1つの問題は、' Users#update_description'アクションが_some_種類のビューをロードすることになっていたことです(私はまだメソッドを書いていませんでした!)。私は単に 'redirect_to user_path(@user)'を追加して動作しました! – globewalldesk

関連する問題