0

マイケル・ハートルによるレールチュートリアルでは、仕様を理解できません:

require 'spec_helper'

describe "Authentication" do
  .
  .
  .
  describe "authorization" do
    .
    .
    .
    describe "as 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 { patch user_path(wrong_user) }
        specify { expect(response).to redirect_to(root_url) }
     end
   end
  end
end 

ご覧のbefore { sign_in user, no_capybara: true }とおり、作成者は各例の前にユーザーをサインインするために使用します。no_capybaraオプションは次のように宣言されています。

仕様/サポート/utilities.rb

.
. 
.
def sign_in(user, options={})
  if options[:no_capybara]
    # Sign in when not using Capybara.
    remember_token = User.new_remember_token
    cookies[:remember_token] = remember_token
    user.update_attribute(:remember_token, User.encrypt(remember_token))
  else
   visit signin_path
   fill_in "Email",    with: user.email
   fill_in "Password", with: user.password
   click_button "Sign in"
  end
end

彼がチュートリアルで指摘したように:これは、HTTPリクエストメソッドの1つを直接(get、post、patch、またはdelete)使用する場合に必要です(彼はno_capybaraオプションを意味します)。これにより、「PATCHリクエストをUsers#update アクション "使用中の パッチメソッドがありますが、上記の sign_in メソッドとこの行 (パッチ メソッドの) との関係は何ですか? 私の理解では、パッチを使用する前にsign_inが使用されていると思います。 no_capybara

4

5 に答える 5

0

カピバラは 'patch' または 'put' HTTP メソッドに直接送信できないため、no_capybara が必要です。

参照:カピバラが直接送信してアクションを実行できないのはなぜですか?

capybara は put/patch にサブミットできないため、手動で変更する必要があるため、Micheal は :no_capybara オプションを使用してそのような状況を識別します。

于 2013-09-05T04:41:29.620 に答える
0

彼は、より高速で依存性の少ないテストスイートを作ろうとしているようです。Capybara ドライバーを使用してログイン プロセスを実行すると、最終的にブラウザーに配置された Cookie が取得されます。これにより、要求間でユーザー セッションが保持されます。

「no_capybara」オプションを指定すると、サインイン ページをレンダリングし、すべての情報を検索して入力し、ページを送信して、ログイン後に最初のページにリダイレクトする必要がなくなります。必要なのはブラウザーの Cookie だけなので、彼はそれを直接設定し、他のすべてをスキップしています。

于 2013-09-05T02:43:37.040 に答える
0

私は同じ問題に直面していましたが、直接 HTTP リクエストを使用するときに別の種類のサインインを使用する必要がある理由も理解できませんでした。

Michael Hartl のチュートリアルのいくつかの部分をもう一度読みましたが、その理由は、Cookie オブジェクトがテスト内でまったく同じように機能しないように思われます。これは単なるシミュレーションであるためです。そのため、直接の http 要求の場合、フォームに入力して「通常の」sign_in を使用するだけではいけません。:no_capybara オプションを使用して、remember_token を Cookie に直接設定する必要があります。

著者のこのコメントがお役に立てば幸いです。

コメント ラインに記載されているように、Capybara を使用していない場合はフォームへの入力が機能しないため、このケースをカバーするために、ユーザーがオプション no_capyabara: true を渡して、デフォルトのサインイン メソッドをオーバーライドし、Cookie を直接操作できるようにします。これは、HTTP リクエスト メソッド (get、post、patch、または delete) のいずれかを直接使用する場合に必要です (リスト 9.45 を参照)。(テスト用の cookies オブジェクトは、実際の cookies オブジェクトを完全にシミュレートしたものではないことに注意してください。特に、リスト 8.19 に示されている cookies.permanent メソッドは、テスト内では機能しません。)将来のテストで、そして実際、すでにいくつかの重複を排除するために使用できます (セクション 9.6)。

于 2013-10-07T06:41:23.843 に答える