如何在Phoenix LiveView 中测试handle_info/2?

How to test handle_info/2 in Phoenix LiveView?

您好 Phoenix LiveView 向导!

上下文

我们有一个基本的 LiveView 计数器应用程序:https://github.com/dwyl/phoenix-liveview-counter-tutorial
代码很简单:/live/counter.ex
该应用程序按预期工作,请参阅:https://live-view-counter.herokuapp.com

测试文件为:test/live_view_counter_web/live/counter_test.exs
我们坚持尝试在测试中调用 handle_info/2 函数。
所以我们的项目中有未经测试的代码。这是不可取的。
参见:https://codecov.io/gh/dwyl/phoenix-liveview-counter-tutorial/src/master/lib/live_view_counter_web/live/counter.ex

我们已经阅读了官方文档https://hexdocs.pm/phoenix_live_view/Phoenix.LiveViewTest.html
但一直无法理解如何去做。我们缺少什么?

我们真的想在我们的"real"项目中使用LiveView,但我们想确保我们的LiveView应用完全 测试。

问题

我们如何编写 test 来调用 handle_info/2 函数?

handle_info/2 is a general behavior of Genserver。如果您阅读文档,您会发现:

Besides the synchronous and asynchronous communication provided by call/3 and cast/2, "regular" messages sent by functions such as Kernel.send/2, Process.send_after/4 and similar, can be handled inside the handle_info/2 callback.

因此,只要您知道流程的 pid,您就可以发送其中任何一个。

经过大量研究,反复试验,错误,错误(迭代),我们得出了以下测试:

test "handle_info/2", %{conn: conn} do
  {:ok, view, disconnected_html} = live(conn, "/")
  assert disconnected_html =~ "Count: 0"
  assert render(view) =~ "Count: 0"
  send(view.pid, %{payload: %{ val: 1 }})
  assert render(view) =~ "Count: 1"
end

感谢@daniel 为我们指明了 send/2 功能的方向。
和@AlekseiMatiushkin 耐心地提出上述探索性问题。 感谢@chrismccord 的见解:https://elixirforum.com/t/how-to-test-handle-info-2-in-phoenix-liveview/30070/7