1

コードの一部を次に示します。さらに必要な場合はお知らせください。投稿します。

class UsersController < ApplicationController

  before_filter :signed_in_user, only: [:edit, :update]
  before_filter :correct_user,   only: [:edit, :update]

  def show
    @user = User.find(params[:id])
  end

  def new
    @user = User.new
  end

  def create
    @user = User.new(params[:user])
    if @user.save
        sign_in @user
        flash[:success] = "Welcome to the Sample App!"
        redirect_to @user
    else
        render 'new'
    end
  end

  def edit
  end

  def update
    if @user.update_attributes(params[:user]) # user_params
        flash[:success] = "Profile updated"
        sign_in @user
        redirect_to @user
    else
        render 'edit'
    end
  end

  private

    def user_params
        params.require(:user).permit(:name, :email, :password, :password_confirmation)
    end

    # Before filters

    def signed_in_user
        redirect_to signin_url, notice: "Please sign in." unless signed_in?
    end

    def correct_user
        @user = User.find(params[:id])
        redirect_to(root_path) unless current_user?(@user)
    end
end

そして、単体テスト...

describe "authorization" do
...
                describe "submitting a PATCH request to the Users#update action" do
                    before { patch user_path(wrong_user) }
                    specify { expect(response).to redirect_to(root_path) }
                end

これを実行すると、次のメッセージが表示されます。

FailureError: before { patch user_path(wrong_user) } NoMethodError: # RSpec::Core::ExampleGroup::Nested_3::Nested_1::Nested_3::Nested_2::Nested_2:0x の未定義のメソッド `patch'...

パッチを投稿に変更すると、これが得られます...

FailureError: before { post user_path(wrong_user) } ActionController::RoutingError: 一致するルートがありません [POST] "users/1497"


put のエラーは実際には、テストがサインイン パスにリダイレクトされていることを示していますが、ブラウザーでテストすると、予想どおりルート パスにリダイレクトされました。私のセッションがテストで持続していないのだろうか。以前のテストで、このようなトラブルを私に与えたのを覚えています...

テストコードの残りの部分は次のとおりです。

    describe "for wrong user" do
        let(:user) { FactoryGirl.create(:user) }
        let(:wrong_user) { FactoryGirl.create(:user, email: "wrong@example.com") }
        before { sign_in user, no_capybara: true }

        describe "visiting Users#edit page" do
            before { visit edit_user_path(wrong_user) }
            it { should_not have_title(full_title('Edit user')) }
        end

        describe "submitting a PATCH request to the Users#update action" do
            before { put user_path(wrong_user) }
            specify { expect(response).to redirect_to(root_path) }
        end
    end # end for wrong user
4

1 に答える 1

3

patchRails 4に存在します.Rails 3.2を使用していますか(質問のタグに記載されています)、put代わりに使用する必要があります

于 2013-07-23T03:35:00.960 に答える