carlogilmar

carlogilmar

How you're testing Live Views in isolation?

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.

Most Liked

krasenyp

krasenyp

I really don’t see a reason to test the assigns as the rendered output should reflect the assigns.

Schultzer

Schultzer

This takes me back to early LV when the testing story left a lot to be decided. Today not so, use the element and render_* API, no need to fiddle with this. And if you’re broadcasting then you can start multiple live views so you can test how it would be to have multiple tabs open for a user or two different users!

egeersoz

egeersoz

Yeah, I see this mistake made often. Assigns should be considered an “implementation detail”, and testing them leads to a lot of brittleness. When it comes to testing one should test the end result, which in this case is the thing that gets rendered (or not).

eahanson

eahanson

I may not be understanding your comment, but I routinely inspect the HTML in tests to a much deeper degree than just looking at a label. I assume the examples of assert html =~ "Click me" are simplified to save space in the docs. I routinely assert on an HTML table’s full contents, assert on the enabled/disabled status of an entire page’s buttons, etc.

Where Next?

Popular in Questions Top

Harrisonl
We have an ECS cluster with 4 services, where each task joins a single cluster, via discovery ECS discovery service. Currently when I de...
New
dokuzbir
Hello, I am trying to convert my lists to string without losing brackets.For start i have 3 map. They look like these buyer = %{ id: ...
New
myronmarston
The Elixir Typespec docs show the following syntax for keyword lists in typespecs: # ... | [key: type] # keyword lis...
New
makeitrein
Hey all, just started picking up Elixir last week and am writing a scraper as a learning project. Baby step #1 is extracting the number ...
New
aadeshere1
I have a another noob question about loop. Since elixir is immutable, while loop is not directly possible. total = 10 while total != 0 ...
New
alice
Hey, Just curious what are the main benefits of Elixir compared to Clojure? When is Elixir more useful than Clojure and vice versa? Th...
New
baxterw3b
Hi guys, i’m new in the Elixir world, and i have to say, that i love it! i’m having some problem to understand anonymous functions with ...
New
chewm
Hi guys, nice to meet you to the whole forum, I’m new here, I’m trying to configure visual studio code for elixir, right now the intellis...
New
jc00ke
Expanding on this topic: https://forum.elixirforum.net/t/map-typespec-question/19217 Let’s say I have a map with required and optional k...
New
jay1
Why is it that the mnesia database isn’t the most preferred database for use in Elixir/Phoenix?
New

Other popular topics Top

yurko
Here are few pieces of (common) Linux knowledge that we use for reasonably small one server apps. We use Ubuntu but this should work for ...
New
Tee
can someone please explain to me how Enum.reduce works with maps
New
chrismccord
This release brings a number of exciting features, including integration with the new Phoenix LiveDashboard and Phoenix LiveView. There h...
New
script
If I have a string “1000 cfu/ml” . I want to remove the characters and / and space . So the string is like this "1000" What is the ...
New
vac
Hi, I'm quite new in Elixir and I'm trying to format a string to a PEM format. I have the certificate value like MIIDBTCCAe2...... and ...
New
freewebwithme
Using vs code and installed ElixirLS: support and debugger. And I got an error popped up on start up says Failed to run ‘elixir’ comma...
New
chensan
I have a User schema with a :from_id field set to type :string: defmodule TweetBot.Repo.Migrations.CreateUsers do use Ecto.Migration ...
New
msaraiva
Surface is an experimental library built on top of Phoenix LiveView and its new LiveComponent API that aims to provide a more declarative...
564 42633 214
New
ovidiubadita
Hey all, I discovered Elixir and I love it. I always wanted to learn a functional programming and I intended to go for Haskell, but afte...
New
baxterw3b
Hi guys, i’m new in the Elixir world, and i have to say, that i love it! i’m having some problem to understand anonymous functions with ...
New

We're in Beta

About us Mission Statement