Hello! Recently I’ve been working with the LiveViews, they are awesome, very easy, very simple, and very fast to build.
But what I not understanding at all is what is the best way to test a Live View, I know that most of the common tests are validating the HTML output just to see if a label is there or not. That’s nice. But I’d like to test the assigns map itself, my intuition tell me that could be great test the LiveView state, check the state when the LV is mounted, when there is a handle_params, when there is a handle_event, when there is a handle_info, etc…
Looking into this I tried to do something like check the process state and try to update it:
%{socket: %{assigns: assigns}} = :sys.get_state(view.pid)
:sys.replace_state(view.pid, fn lv_view ->
update_in(lv_view.socket.assigns, &Map.merge(&1, %{
data: %{...}
}))
end)
This works, but I’m not convinced at all of implement this in my tests. Why I want this? Because sometimes a LV needs modules that are not ready, so I’d like to design in isolation just passing data.
Other option is explore a way to pass a function in the assigns and pass a function to mock data like:
assign_new(socket, :data, fn -> MyApp.get_data() end)
{:ok, view, _html} =
live_isolated(conn, MyAppWeb.MyLive,
assigns: %{data: %{...}}
)
Maybe I’m not understanding something about how to test a LV. Maybe I’m just a crazy guys trying this ideas… but hey, maybe some of you have different approaches to do this.
Thanks for reading.