Кабельное тестирование с Devise - PullRequest
0 голосов
/ 28 сентября 2018

Приложение Ruby on Rails работает как нужно.Вещи транслируются и принимаются как я хочу.Однако я хочу добавить модульное тестирование для каналов, используя action-cable-testing gem.Моя регистрация пользователя осуществляется с использованием Devise.Вот мой connection.rb файл:

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
        reject_unauthorized_connection
      end
    end
  end
end

У меня есть message_notifications_channel.rb, подобный этому:

class MessageNotificationsChannel < ApplicationCable::Channel
  def subscribed
    # stream_from "some_channel"
    if current_user&.account_id
      stream_from "message_notifications_channel_#{current_user.account_id}"
    end
  end

  def unsubscribed
    # Any cleanup needed when channel is unsubscribed
  end
end

Этот канал позволяет пользователю при входе осуществлять потоковую передачу с message_notifications_channel_accountID где accountID - это идентификатор учетной записи, к которой принадлежит пользователь.

Мой cable.js файл такой же, как показано в руководстве по ruby:

// Action Cable provides the framework to deal with WebSockets in Rails.
// You can generate new channels where WebSocket features live using the `rails generate channel` command.
//
//= require action_cable
//= require_self
//= require_tree ./channels

(function() {
  this.App || (this.App = {});

  App.cable = ActionCable.createConsumer();

}).call(this);

У меня проблемы со следующим тестом rspec:

require 'rails_helper'

RSpec.describe MessageNotificationsChannel, type: :channel do
  let(:authorized_senders) {['11111']}
  let(:common_user_phone){'17777777777'}
  let(:account) {FactoryGirl.create(:account, authorized_senders: authorized_senders)}
  let(:user){FactoryGirl.create(:user, account: account, admin: true)}
  context 'when user is authenticated' do
    describe '#connect' do
      it 'accepts connection' do
        sign_in user
        subscribe(account_id: user.account_id)
      end
    end
  end
end

Я получил следующую ошибку: Ошибка / Ошибка: если current_user & .account_id

 NameError:
   undefined local variable or method `current_user' for #<MessageNotificationsChannel:0x000000000721d890>

Расположение ошибки находится в моем файле message_notifications_channel.rb.Я поставил byebug перед self.current_user = find_verified_user в методе connect в connection.rb, тест вообще не ударил бы этого клопа.И неудивительно, что я получу эту ошибку позже.

Когда я работаю в среде разработки, byebug получит удар, и все будет работать нормально.

Это мой cable.yml:

redis: &redis
  adapter: redis
  url: redis://localhost:6379/1

production: *redis
development: *redis
test:
 *redis

Я смотрел на https://github.com/palkan/action-cable-testing/issues/26#issuecomment-392481619 Код этого человека на самом деле не использует Devise.Очень важно, чтобы все части моего приложения использовали устройство для аутентификации пользователей.Спасибо!

...