Reputation: 33214
Greetings Phoenix LiveView Wizards! 👋
We have a basic LiveView counter app: https://github.com/dwyl/phoenix-liveview-counter-tutorial
The code is very simple: /live/counter.ex
The App works as expected, see: https://live-view-counter.herokuapp.com
The test file is: test/live_view_counter_web/live/counter_test.exs
We are stuck with trying to invoke the handle_info/2
function in a test.
So we have code in our project that is untested. Which is undesirable.
See: https://codecov.io/gh/dwyl/phoenix-liveview-counter-tutorial/src/master/lib/live_view_counter_web/live/counter.ex
We have read through the official docs https://hexdocs.pm/phoenix_live_view/Phoenix.LiveViewTest.html
but have not been able to understand how to do it. What are we missing?
We really want to use LiveView
in our "real" projects, but we want to ensure that our LiveView
apps are fully tested.
How do we write a test to invoke the handle_info/2
function?
Upvotes: 4
Views: 1641
Reputation: 33214
After much research, trial and error, error, error (iteration), we came up with the following test:
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
Thanks to @daniel for pointing us in the direction of the send/2
function.
and @AlekseiMatiushkin for patiently asking probing questions above. 👍
Thanks to @chrismccord for the insight: https://elixirforum.com/t/how-to-test-handle-info-2-in-phoenix-liveview/30070/7
Upvotes: 6
Reputation: 2554
handle_info/2
is a general behavior of Genserver
. If you read documentation, you can find:
Besides the synchronous and asynchronous communication provided by
call/3
andcast/2
, "regular" messages sent by functions such asKernel.send/2
,Process.send_after/4
and similar, can be handled inside thehandle_info/2
callback.
So you can send either of those as long as you know the pid
of the process.
Upvotes: 2