Приложение 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.Очень важно, чтобы все части моего приложения использовали устройство для аутентификации пользователей.Спасибо!