使用 Devise 进行动作电缆测试
action-cable-testing with Devise
我在 Rails 上的 Ruby 应用程序运行正常。事情正在按照我的意愿进行广播和接收。但是,我想使用 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 是用户所属帐户的 ID。
我的 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
我得到的错误是:
Failure/Error: 如果current_user&.account_id
NameError:
undefined local variable or method `current_user' for #<MessageNotificationsChannel:0x000000000721d890>
错误位置在我的message_notifications_channel.rb
文件中。我在connection.rb
中的connect
方法中的self.current_user = find_verified_user
之前放了一个byebug
,测试根本不会命中那个byebug。毫不奇怪,我稍后会收到该错误。
当我在开发环境中 运行 时,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。我的应用程序的所有部分都使用设计来进行用户身份验证,这一点至关重要。
谢谢!
尝试将“stub_connection current_user: users(:some_user_from_fixtures)” 添加到您的测试中。因此,对于您的代码,它将是:
it 'accepts connection' do
sign_in user
stub_connection current_user: user
subscribe(account_id: user.account_id)
end
这应该有效。更多信息请访问 rails 官方文档:Testing Action Cable
我在 Rails 上的 Ruby 应用程序运行正常。事情正在按照我的意愿进行广播和接收。但是,我想使用 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 是用户所属帐户的 ID。
我的 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
我得到的错误是: Failure/Error: 如果current_user&.account_id
NameError:
undefined local variable or method `current_user' for #<MessageNotificationsChannel:0x000000000721d890>
错误位置在我的message_notifications_channel.rb
文件中。我在connection.rb
中的connect
方法中的self.current_user = find_verified_user
之前放了一个byebug
,测试根本不会命中那个byebug。毫不奇怪,我稍后会收到该错误。
当我在开发环境中 运行 时,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。我的应用程序的所有部分都使用设计来进行用户身份验证,这一点至关重要。 谢谢!
尝试将“stub_connection current_user: users(:some_user_from_fixtures)” 添加到您的测试中。因此,对于您的代码,它将是:
it 'accepts connection' do
sign_in user
stub_connection current_user: user
subscribe(account_id: user.account_id)
end
这应该有效。更多信息请访问 rails 官方文档:Testing Action Cable