メインコンテンツまでスキップ

have_stream_from マッチャー

have_stream_from マッチャーは、指定されたストリームにチャンネルが購読されているかどうかを確認するために使用されます。 もしチャンネルで stream_for を使用してモデルに購読する場合は、代わりに have_stream_for マッチャーを使用してください。

have_no_streams マッチャーは、チャンネルがどのストリームにも購読されていないかどうかを確認するために使用されます。

このマッチャーは、チャンネルのスペックでのみ利用可能です。

背景

アクションケーブルのテストが利用可能であることが前提です。

かつ、以下の内容で "app/channels/chat_channel.rb" という名前のファイルが存在すること:

class ChatChannel < ApplicationCable::Channel
def subscribed
reject unless params[:room_id].present?

stream_from "chat_#{params[:room_id]}"
end

def leave
stop_all_streams
end
end

パラメータを使用して購読し、ストリームを確認する

以下の内容で "spec/channels/chat_channel_spec.rb" という名前のファイルが存在すること:

require "rails_helper"

RSpec.describe ChatChannel, type: :channel do
it "successfully subscribes" do
subscribe room_id: 42

expect(subscription).to be_confirmed
expect(subscription).to have_stream_from("chat_42")
end
end

rspec spec/channels/chat_channel_spec.rb を実行すると、

例がパスするはずです。

すべてのストリームを停止する

以下の内容で "spec/channels/chat_channel_spec.rb" という名前のファイルが存在すること:

require "rails_helper"

RSpec.describe ChatChannel, type: :channel do
it "successfully subscribes" do
subscribe(room_id: 42)

expect(subscription).to have_stream_from("chat_42")

perform :leave
expect(subscription).not_to have_streams
end
end

rspec spec/channels/chat_channel_spec.rb を実行すると、

例がパスするはずです。

モデルの購読とストリームの確認

以下の内容で "app/channels/notifications_channel.rb" という名前のファイルが存在すること:

class NotificationsChannel < ApplicationCable::Channel
def subscribed
stream_for current_user
end
end

かつ、以下の内容で "app/channels/application_cable/connection.rb" という名前のファイルが存在すること:

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

かつ、以下の内容で "app/models/user.rb" という名前のファイルが存在すること:

class User < Struct.new(:name)
def to_gid_param
name
end
end

かつ、以下の内容で "spec/channels/user_channel_spec.rb" という名前のファイルが存在すること:

require "rails_helper"
RSpec.describe NotificationsChannel, type: :channel do
it "successfully subscribes to user's stream" do
stub_connection current_user: User.new(42)
subscribe
expect(subscription).to be_confirmed
expect(subscription).to have_stream_for(User.new(42))
end
end

rspec spec/channels/user_channel_spec.rb を実行すると、

例がパスするはずです。