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

have_broadcasted_to マッチャー

have_broadcasted_to(または broadcast_to としてエイリアスされる)マッチャーは、指定されたストリームにメッセージがブロードキャストされたかどうかをチェックするために使用されます。

背景

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

ストリーム名のチェック

「spec/models/broadcaster_spec.rb」という名前のファイルがあるとします。

require "rails_helper"

RSpec.describe "broadcasting" do
it "matches with stream name" do
expect {
ActionCable.server.broadcast(
"notifications", { text: "Hello!" }
)
}.to have_broadcasted_to("notifications")
end
end

「rspec spec/models/broadcaster_spec.rb」と実行すると、

すべての例がパスするはずです。

ストリームに渡されたメッセージのチェック

「spec/models/broadcaster_spec.rb」という名前のファイルがあるとします。

require "rails_helper"

RSpec.describe "broadcasting" do
it "matches with message" do
expect {
ActionCable.server.broadcast(
"notifications", { text: "Hello!" }
)
}.to have_broadcasted_to("notifications").with(text: 'Hello!')
end
end

「rspec spec/models/broadcaster_spec.rb」と実行すると、

すべての例がパスするはずです。

ストリームに渡されたメッセージが一致するかのチェック

「spec/models/broadcaster_spec.rb」という名前のファイルがあるとします。

require "rails_helper"

RSpec.describe "broadcasting" do
it "matches with message" do
expect {
ActionCable.server.broadcast(
"notifications", { text: 'Hello!', user_id: 12 }
)
}.to have_broadcasted_to("notifications").with(a_hash_including(text: 'Hello!'))
end
end

「rspec spec/models/broadcaster_spec.rb」と実行すると、

すべての例がパスするはずです。

ブロックを使用した渡されたメッセージのチェック

「spec/models/broadcaster_spec.rb」という名前のファイルがあるとします。

require "rails_helper"

RSpec.describe "broadcasting" do
it "matches with message" do
expect {
ActionCable.server.broadcast(
"notifications", { text: 'Hello!', user_id: 12 }
)
}.to have_broadcasted_to("notifications").with { |data|
expect(data['user_id']).to eq 12
}
end
end

「rspec spec/models/broadcaster_spec.rb」と実行すると、

すべての例がパスするはずです。

エイリアスメソッドの使用

「spec/models/broadcaster_spec.rb」という名前のファイルがあるとします。

require "rails_helper"

RSpec.describe "broadcasting" do
it "matches with stream name" do
expect {
ActionCable.server.broadcast(
"notifications", { text: 'Hello!' }
)
}.to broadcast_to("notifications")
end
end

「rspec spec/models/broadcaster_spec.rb」と実行すると、

すべての例がパスするはずです。

レコードへのブロードキャストのチェック

「spec/channels/chat_channel_spec.rb」という名前のファイルがあるとします。

require "rails_helper"

RSpec.describe ChatChannel, type: :channel do
it "matches with stream name" do
user = User.new(42)

expect {
ChatChannel.broadcast_to(user, text: 'Hi')
}.to have_broadcasted_to(user)
end
end

および「app/models/user.rb」という名前のファイルがあるとします。

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

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

例がパスするはずです。

チャンネル以外のスペックでのレコードへのブロードキャストのチェック

「spec/models/broadcaster_spec.rb」という名前のファイルがあるとします。

require "rails_helper"

RSpec.describe "broadcasting" do
it "matches with stream name" do
user = User.new(42)

expect {
ChatChannel.broadcast_to(user, text: 'Hi')
}.to broadcast_to(ChatChannel.broadcasting_for(user))
end
end

および「app/models/user.rb」という名前のファイルがあるとします。

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

「rspec spec/models/broadcaster_spec.rb」と実行すると、

例がパスするはずです。