0

このセクションでは、ユーザーが自分のプロファイルのみを編集および更新できるように制限することになっています。これを除いて、私のすべてのテストはこの時点まで合格します:

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

       describe "visiting Users#edit page" do
         before { visit edit_user_path(wrong_user) }
         it { should_not have_selector('title', text: full_title('Edit user')) }
       end

       describe "submitting a PUT request to the Users#update action" do
         before { put user_path(wrong_user) }
         specify { response.should redirect_to(root_path) }
       end
     end

具体的には、最後の部分であるリダイレクトです。これは、テストを実行したときに得られるものです。

  1) Authentication authorization as wrong user submitting a PUT request to the Users#update action 
     Failure/Error: specify { response.should redirect_to(root_path) }
       Expected response to be a redirect to <http://www.example.com/> but was a redirect to <http://www.example.com/signin>
     # ./spec/requests/authentication_spec.rb:86:in `block (5 levels) in <top (required)>'

しかし、Web サイトでこれと同じことをしようとすると、問題なく動作し、ユーザーはアプリケーションの root_path にリダイレクトされます。

4

2 に答える 2

2

Github リポジトリからコードをチェックアウトしましたが、 app/helpers/sessions_helper.rbへの変更がテストの失敗の原因のようです。ファイルチュートリアルのファイルと比較します。sessionメソッドでハッシュの代わりにハッシュを使用していcookiesます。コードを次のように変更してエラー"submitting a PUT request to the Users#update action"を修正しました。"submitting a DELETE request to the Users#destroy action"

アプリ/ヘルパー/sessions_helper.rb

module SessionsHelper
  # ...

  def sign_in(user)
    # session[:remember_token] = user.remember_token
    cookies.permanent[:remember_token] = user.remember_token
    self.current_user = user
  end

  def sign_out
    self.current_user = nil
    # session.delete(:remember_token)
    cookies.delete(:remember_token)
  end

  def current_user
    # @current_user ||= User.find_by_remember_token(session[:remember_token])
    @current_user ||= User.find_by_remember_token(cookies[:remember_token])
  end

  # ...
end

Rails チュートリアルの Rails 3.0 バージョンで、 hash を hash に完全に置き換えた演習がありましたが、適切実行cookiessessionできなかったことを思い出し、とにかく3.2 バージョンにはないようですcookies。このファイルのハッシュに固執するのが最も安全だと思われます。

于 2012-08-27T07:27:27.570 に答える
1

このリスト 9.6 のコードはあなたのコードで書かれていますか?

# Sign in when not using Capybara as well.
cookies[:remember_token] = user.remember_token
  1. Capybara はブラウザのように動作するため、Rails アプリからいくつかの Cookie を受け取ることができます。

  2. カピバラは「fill_in」と「visit」を使ってブラウザを操作するようにアプリをテストできます。

  3. Capybara で「PUT /users/1」リクエストを発行するには、「/users/1/edit」に移動し、「edit」リンクをクリックする必要があります。ただし、Rails アプリでは、ユーザーが他のユーザーにアクセスすることを許可していません。これは、前のテスト例で渡されます。

  4. カピバラで直接「PUT /users/1」を発行することはできません。代わりに、「プット」を使用する必要があります。Rspec はアプリから Cookie を受け取ることができません。したがって、リスト 9.6 のように Cookie を設定する必要があります。

  5. テスト例で「PUT /users/1」リクエストが発行され、cookie に remember_token が含まれていない場合、サインインしていないユーザーとしてサインイン ページにリダイレクトされます。ただし、このテストでは、サインインしているユーザーが他のユーザーのリソースに put リクエストを直接送信すると、ルート ページにリダイレクトされることを意図しています。

于 2012-08-22T23:41:25.640 に答える