如何测试从不同频道或控制器对频道进行的广播?

Vys*_*san 5 elixir phoenix-framework

我有一个驱动程序频道,它将其位置广播到供应商频道.

defmodule MyApp.DriverChannel do
    #...

    def handle_in("transmit", payload, socket) do
      MyApp.Endpoint.broadcast! "vendors:lobby", "track", payload
      {:noreply, socket}
    end
end

defmodule MyApp.DriverChannelTest do

  #....

  test "location broadcasts to vendors:lobby", %{socket: socket} do
    push socket, "transmit", %{"hello" => "all"}
    assert_broadcast "track", %{"hello" => "all"}
    # Want something like this
    # assert_broadcast "vendors:lobby", "track", %{"hello" => "all"}
  end

end
Run Code Online (Sandbox Code Playgroud)

这个断言会失败,因为它只检查广播DriverChannel,如何断言广播VendorChannel,我查看了源代码,似乎没有选项传递channel_name给assert_broadcast宏.

[另一个注意事项]我也有控制器播放,如果我知道答案,我也可以断言那些广播!:)

Chr*_*ord 6

assert_broadcast仅适用于订阅主题,但您可以通过MyApp.Endpoint.subscribe/2直接订阅,并且assert_receive:

test "location broadcasts to vendors:lobby", %{socket: socket} do
  MyApp.Endpoint.subscribe(self, "vendors:lobby")
  push socket, "transmit", %{"hello" => "all"}
  assert_broadcast "track", %{"hello" => "all"}
  assert_receive %Phoenix.Socket.Broadcast{
    topic: "vendors:lobby",
    event: "track",
    payload: %{"hello" => "all"}}
end
Run Code Online (Sandbox Code Playgroud)