【问题标题】:How to test handle_info/2 in Phoenix LiveView?如何在 Phoenix LiveView 中测试 handle_info/2?
【发布时间】:2020-07-05 23:37:48
【问题描述】:

您好 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
但一直无法理解如何做到这一点。我们缺少什么?

我们真的希望在我们的“真实”项目中使用LiveView,但我们希望确保我们的LiveView 应用程序经过完全测试。

问题

我们如何编写一个测试来调用handle_info/2函数?

【问题讨论】:

  • 您能否详细说明here 不清楚的地方?
  • @AlekseiMatiushkin 感谢您的快速回复。不清楚如何设置测试文件然后调用handle_event/3 函数。但是从重新阅读文档来看,我们似乎没有直接调用函数,而是render_click(view, :inc) ??(谢谢您帮助我们实现了这一目标...)
  • handle_event/3 是消息到达 LV 进程的回调,这意味着人们永远不想通过直接调用来测试它。
  • 更新了问题以反映测试 handle_info/2 函数的挑战。

标签: elixir phoenix-framework functional-testing phoenix-channels phoenix-live-view


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    handle_info/2Genserver 的一般行为。如果您阅读文档,您会发现:

    除了提供的同步和异步通信 call/3cast/2,由函数发送的“常规”消息,例如 Kernel.send/2, Process.send_after/4 和类似的,可以在里面处理 handle_info/2 回调。

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

    【讨论】:

    • 感谢您为我们指明正确的方向@Daniel ?(回答赞成)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多