1

チャンネル登録者を認証するための次のコードがあります。

module ApplicationCable
  class Connection < ActionCable::Connection::Base
    identified_by :current_user

    def connect
      self.current_user = find_verified_user
    end

    protected
      def find_verified_user
        if current_user = User.find_by(id: cookies.signed[:user_id])
          current_user
        else
          reject_unauthorized_connection
        end
      end
  end
end

そして、すべてがうまくいきます。問題は機能テストにあります。このテストを実行すると:

require 'rails_helper'

feature 'Chat room' do
  scenario "send one message" do
    user = create(:user)
    login_as(user, :scope => :user)

    expect {
      fill_in 'message', with: 'hello friend'
      click_button 'Send'
      byebug
    }.to change(Message, :count).by(1)
    expect(current_path).to eq root_path
    expect(page).to have_content 'hello friend'
  end
end

テストログには、「不正な接続試行が拒否されました」と書かれています。Cookie が空であるため、認証できません。

では、カピバラ テストで Cookie を設定するにはどうすればよいですか?

テストでこれを実行しようとしcookies.signed[:user_id] = user.idましたが、機能しません。

cookies.signed[:user_id] = user.idテストでこのようにクッキーを設定するにはどうすればよいですか?

4

1 に答える 1

0

呼び出している が Warden テスト ヘルパーからのものであると仮定するとlogin_as、次の要求が応答でセッション cookie を設定するようにセットアップされます。このため、おそらく を呼び出した後にページにアクセスする必要がありますlogin_as。さらに、'Send' のクリックは非同期であるため、Message.count が変更されたことを確認する前に、何かが変更されるのを待つ必要があります。だから、すべてのようなものを組み合わせた

#don't visit the page where you can fill in the message before calling login_as


scenario "send one message" do
  user = create(:user)
  login_as(user, :scope => :user)
  visit 'the path to the page where you can fill in a message'
  expect {
    fill_in 'message', with: 'hello friend'
    click_button 'Send'
    expect(page).to have_css('#messages', text:'hello friend') # adjust selector depending on where the message is supposed to appear
    expect(page).to have_current_path(root_path)
  }.to change(Message, :count).by(1)
end

あなたのために働くべきです

于 2016-03-15T18:20:11.367 に答える