Как заглушить env ['warden']. User для ApplicationCable :: Тесты соединения с rspec - PullRequest
0 голосов
/ 16 декабря 2018

Rails 5.2 У меня есть следующий файл ApplicationCable :: Connection ruby:

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

    identified_by :current_user

    def connect
      self.current_user = find_verified_user
    end

    private

    def find_verified_user
      if verified_user = env['warden'].user
        verified_user
      else
        message = "The user is not found. Connection rejected."
        logger.add_tags 'ActionCable', message  
        self.transmit error: message 
        reject_unauthorized_connection
      end
    end
  end
end

Я хочу проверить эту настройку и использовать следующий тест RSpec:

require 'rails_helper.rb'

RSpec.describe ApplicationCable::Connection, type: :channel do

  it "successfully connects" do
    connect "/cable", headers: { "X-USER-ID" => 325 }
    expect(connection.user_id).to eq 325
  end
end

Что не получаетсяс:

Сбой / Ошибка: если Verified_user = env ['warden']. user

NoMethodError: неопределенный метод `[] 'для nil: NilClass

Так что я хочучтобы заглушить код пользователя env ['warden']. и вернуть id 325. Я попробовал следующее:

allow(env['warden']).to receive(:user).and_return(325)

Но это привело к следующей ошибке:

undefined local variable or methodenv '

Как я могу проверить этот класс?

Ответы [ 2 ]

0 голосов
/ 19 декабря 2018

Вот хорошее объяснение вашей проблемы https://stackoverflow.com/a/17050993/299774

Вопрос был о тестах контроллера, но он действительно похож.

Я также не думаю, что вы должны получить доступ к низкому уровню env['warden'] в вашем контроллере.Что, если авторы драгоценных камней решат это изменить - вам придется исправить свое приложение.Вероятно, объекты-надзиратели инициализируются с помощью этой конфигурации, и должен быть доступен объект (просто не обязательно, когда вы запускаете свои спецификации - как описано в ссылке выше).

0 голосов
/ 19 декабря 2018

Попробуйте это:

require 'rails_helper.rb'

RSpec.describe ApplicationCable::Connection, type: :channel do

   let(:user)    { instance_double(User, id: 325) }
   let(:env)     { instance_double('env') }

  context 'with a verified user' do

     let(:warden)  { instance_double('warden', user: user) } 

    before do
      allow_any_instance_of(ApplicationCable::Connection).to receive(:env).and_return(env)
      allow(env).to receive(:[]).with('warden').and_return(warden)
    end

    it "successfully connects" do
      connect "/cable", headers: { "X-USER-ID" => 325 }
      expect(connect.current_user.id).to eq 325
    end

  end

  context 'without a verified user' do

    let(:warden)  { instance_double('warden', user: nil) }

    before do
      allow_any_instance_of(ApplicationCable::Connection).to receive(:env).and_return(env)
      allow(env).to receive(:[]).with('warden').and_return(warden)
    end

    it "rejects connection" do
      expect { connect "/cable" }.to have_rejected_connection
    end

  end
end
...