byoungdale
Using render_change for testing input element changes - is this the correct way?
I am trying to write a test for a phx-change event I have on a input element inside a form. The phx-change happens only on the input element, not a change on the form.
<%= url_input f, :url, phx_debounce: "2000", phx_change: "validate_url" %>
Everything works functionally, but I wrote this test for the element:
test "successful URLs", %{conn: conn} do
{:ok, view, _html} = live(conn, "/submit")
assert view
|> element("#submit-item-form_url")
|> render_change(:validate_url, %{url: "https://elixir-lang.org/learning.html"}) =~
"value=\"Learning resources - The Elixir programming language\""
But, when I run the test, I get this error:
1) test successful URLs (CommunWeb.Live.SubmitItemLiveTest)
test/commun_web/live/submit_item_live_test.exs:15
** (FunctionClauseError) no function clause matching in Phoenix.LiveViewTest.render_event/4
The following arguments were given to Phoenix.LiveViewTest.render_event/4:
# 1
#Phoenix.LiveViewTest.Element<selector: "#submit-item-form_url", text_filter: nil, ...>
# 2
:change
# 3
:validate_url
# 4
%{url: "https://elixir-lang.org/learning.html"}
Attempted function clauses (showing 1 out of 1):
defp render_event(%Phoenix.LiveViewTest.View{} = view, type, event, value) when is_map(value) or is_list(value)
code: |> render_change(:validate_url, %{url: "https://elixir-lang.org/learning.html"}) =~
stacktrace:
(phoenix_live_view 0.17.10) lib/phoenix_live_view/test/live_view_test.ex:887: Phoenix.LiveViewTest.render_event/4
test/commun_web/live/submit_item_live_test.exs:20: (test)
It is complaining that the private function render_event is expecting a %Phoenix.LiveViewTest.View{} type, but the render_change function expects an Phoenix.LiveViewTest.Element type, which is what i am passing.
I think I am missing something or is this not the correct way to test a render_change event on an input element?
First Post!
byoungdale
I think the issue is that when a Element is passed to render_change, it does not allow for a customer event to be passed:
def render_change(%Element{} = element, value), do: render_event(element, :change, value)
for reference see source code here
So, when I change my test to this:
assert view
|> element("#submit-item-form_url")
|> render_change(%{url: "https://elixir-lang.org/learning.html"}) =~
"value=\"Learning resources - The Elixir programming language\""
My input’s phx-change event validate_url doesn’t get triggered. Just a generic :change event which means my view doesn’t get the url input added to it.
I think adding another match like this would work:
def render_change(%Element{} = element, event, value), do: render_event(element, event, value)
Last Post!
byoungdale
Thank you. The solution was actually not adding the target. The issue was passing in a map instead of a key: map which is what my liveview event handler was expecting.
Here is what ended up working:
assert view
|> element("#submit-item-form_url")
|> render_change(item: %{url: "https://elixir-lang.org/learning.html"}) =~
"value=\"Learning resources - The Elixir programming language\""
So, I had two problems. First, I was manually passing in the render_change event name when I did not need to, which caused the render_event pattern matching to fail in live_view_test.ex, and then without manually passing in the event name, I was not passing the value correctly for my handle_event function.
I only caught that because of the example you posted. Thank you for your help!
Popular in Questions
Other popular topics
Categories:
Sub Categories:
Forums
Popular Tags
- #ecto
- #liveview
- #troubleshooting
- #learning-elixir
- #deployment
- #library
- #erlang
- #testing
- #genserver
- #mix
- #absinthe
- #remote-other
- #otp
- #plug
- #how-to-question
- #macros
- #postgres
- #channels
- #elixirconf
- #exunit
- #discussion
- #code-sync
- #javascript
- #podcasts
- #onsite
- #dialyzer
- #docker
- #authentication
- #umbrella
- #full-time-contract
- #podcasts-by-brainlid
- #ecto-query
- #elixir-ls
- #phoenix_html
- #iex
- #blog-post
- #graphql
- #genstage
- #ai
- #websockets
- #supervisor
- #elixirconf-us
- #advent-of-code
- #distillery
- #processes
- #api
- #forms
- #metaprogramming
- #security
- #hex









