【问题标题】:How to test the broadcast made to a channel from different channel or controller?如何测试从不同频道或控制器对频道进行的广播?
【发布时间】:2016-01-31 20:26:50
【问题描述】:

我有一个司机频道,可以将他们的位置广播到供应商频道。

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

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

[ 另一个说明] 我也有从控制器发出的广播,如果我知道这个问题的答案,我也可以断言这些广播! :)

【问题讨论】:

    标签: elixir phoenix-framework


    【解决方案1】:

    你需要的新版本self

    • 订阅:MyApp.Endpoint.subscribe("vendors:lobby")
    • 退订:MyApp.Endpoint.unsubscribe("vendors:lobby")

    如果您不“取消订阅”,您将收到警告:

    [warning] Passing a Pid to Phoenix.PubSub.subscribe is deprecated. Only the calling process may subscribe to topics
    

    新代码:

    test "location broadcasts to vendors:lobby", %{socket: socket} do
      MyApp.Endpoint.subscribe("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"}
      MyApp.Endpoint.unsubscribe("vendors:lobby")
    end
    

    【讨论】:

      【解决方案2】:

      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
      

      【讨论】:

      • 谢谢,它适用于通道测试:) 我尝试在控制器测试中这样做,但它会引发错误“没有消息匹配”。我有一个控制器操作 trackMyApp.Endpoint.broadcast! "vendors:lobby", "track", %{ "hello" => "all" } 并且在我的控制器测试中不能使用 assert_receive :(
      • 失败的assert_receive 错误说当前在您的邮箱中是什么?它会说您的邮箱是空的,或者会显示邮箱中邮件的当前内容。您可能会收到消息但没有正确匹配。或者你的测试暴露了你的控制实现中的一个错误。
      猜你喜欢
      • 2018-12-24
      • 2016-11-27
      • 2017-06-01
      • 2016-07-24
      • 1970-01-01
      • 2011-01-15
      • 1970-01-01
      • 1970-01-01
      • 2021-11-15
      相关资源
      最近更新 更多