檢視原始碼 Phoenix.LiveViewTest (Phoenix LiveView v0.20.17)

用於測試函數元件、LiveView 和 LiveComponent 的便利性。

測試函數元件

有兩種測試函數元件的機制。想像以下元件:

def greet(assigns) do
  ~H"""
  <div>Hello, <%= @name %>!</div>
  """
end

你可以使用 render_component/3 測試它,將函數參考傳遞給元件作為第一個引數

import Phoenix.LiveViewTest

test "greets" do
  assert render_component(&MyComponents.greet/1, name: "Mary") ==
           "<div>Hello, Mary!</div>"
end

但是,對於複雜的元件,通常最簡單的測試方法是使用 ~H sigil 本身

import Phoenix.Component
import Phoenix.LiveViewTest

test "greets" do
  assigns = %{}
  assert rendered_to_string(~H"""
         <MyComponents.greet name="Mary" />
         """) ==
           "<div>Hello, Mary!</div>"
end

不同之處在於我們使用 rendered_to_string/1 將產生的範本轉換為字串進行測試。

測試 LiveView 和 LiveComponent

在 LiveComponent 和 LiveView 測試中,我們透過處理過程通訊與檢視互動,以取代瀏覽器。我們的測試程序就像瀏覽器一樣,從檢視收到關於已產生更新的訊息,可以對其進行聲明,以測試 LiveView 及其子項目的生命週期和行為。

測試 LiveView

Phoenix.LiveView 文件中概述的 LiveView 生命週期詳細說明了檢視如何從非狀態的 HTML 產生開始,並處於斷開的 socket 狀態中。瀏覽器收到 HTML 後,它會連線到伺服器,並啟動新的 LiveView 程序,重新掛載在連線的 socket 狀態中,並且檢視會繼續保持狀態。LiveView 測試函式支援分別測試斷開和連線的掛載,例如

import Plug.Conn
import Phoenix.ConnTest
import Phoenix.LiveViewTest
@endpoint MyEndpoint

test "disconnected and connected mount", %{conn: conn} do
  conn = get(conn, "/my-path")
  assert html_response(conn, 200) =~ "<h1>My Disconnected View</h1>"

  {:ok, view, html} = live(conn)
end

test "redirected mount", %{conn: conn} do
  assert {:error, {:redirect, %{to: "/somewhere"}}} = live(conn, "my-path")
end

在此,我們首先使用熟悉的 Phoenix.ConnTest 函式 get/2 來測試常規的 HTTP GET 請求,該請求會使用斷開的 socket 呼叫掛載。然後,對 live/1 呼叫已傳送的連線,以連線狀態掛載檢視,這會啟動我們的狀態 LiveView 程序。

一般來說,只要您不需要狀態 HTTP 呈現的結果,測試單一步驟中的檢視掛載通常會比較方便。這可透過單次呼叫 live/2 來完成,這將為我們執行 get 步驟

test "connected mount", %{conn: conn} do
  {:ok, _view, html} = live(conn, "/my-path")
  assert html =~ "<h1>My Connected View</h1>"
end

測試事件

瀏覽器可透過 phx- 約束,傳送各種事件給 LiveView,再將其傳送給 handle_event/3 回呼。若要測試瀏覽器傳送的事件,並對事件的已呈現副作用執行斷言,請使用 render_* 函式

  • render_click/1 - 傳送 phx-click 事件和值,傳回 handle_event/3 回呼的已呈現結果。

  • render_focus/2 - 傳送 phx-focus 事件和值,傳回 handle_event/3 回呼的已呈現結果。

  • render_blur/1 - 傳送 phx-blur 事件和值,傳回 handle_event/3 回呼的已呈現結果。

  • render_submit/1 - 傳送表單 phx-submit 事件和值,傳回 handle_event/3 回呼的已呈現結果。

  • render_change/1 - 傳送表單 phx-change 事件和值,傳回 handle_event/3 回呼的已呈現結果。

  • render_keydown/1 - 傳送表單 phx-keydown 事件和值,傳回 handle_event/3 回呼的已呈現結果。

  • render_keyup/1 - 傳送表單 phx-keyup 事件和值,傳回 handle_event/3 回呼的已呈現結果。

  • render_hook/3 - 傳送掛鉤事件和值,傳回 handle_event/3 回呼的已呈現結果。

例如

{:ok, view, _html} = live(conn, "/thermo")

assert view
       |> element("button#inc")
       |> render_click() =~ "The temperature is: 31℉"

以上範例中,我們正在尋找頁面上的特定元素,並觸發其 phx-click 事件。LiveView 會確保元素有 phx-click,並自動將其值傳送給伺服器。

您也可以略過元素查詢,並在大部分函式中直接觸發 LiveView 事件

assert render_click(view, :inc, %{}) =~ "The temperature is: 31℉"

儘量使用 element 樣式,因為這有助於 LiveView 執行驗證並確保 HTML 中的事件實際上與伺服器上的事件名稱相符。

測試一般訊息

LiveViews 是內建於 GenServer 之中,並且可以像其他任何伺服器一樣傳送和接收訊息。若要測試傳送或接收訊息的副作用,只需傳送訊息至檢視區並使用 render 函式來測試結果

send(view.pid, {:set_temp, 50})
assert render(view) =~ "The temperature is: 50℉"

測試 LiveComponents

LiveComponents 可以用兩種方式進行測試。一種方法是用與函式元件相同的 render_component/2 函式。這會掛載 LiveComponent 並僅呈現一次,而不會測試其任何事件

assert render_component(MyComponent, id: 123, user: %User{}) =~
         "some markup in component"

然而,如果你想測試元件是如何由 LiveView 掛載並與 DOM 事件互動,你必須使用一般 live/2巨集,利用元件來建立 LiveView,然後在清單中傳遞檢視區和 DOM 選擇器 來進行事件作用域

{:ok, view, html} = live(conn, "/users")
html = view |> element("#user-13 a", "Delete") |> render_click()
refute html =~ "user-13"
refute view |> element("#user-13") |> has_element?()

在上述範例中,LiveView 將尋找 ID=user-13 的元素並取得其 phx-target 。如果 phx-target 指向元件,這將會是所使用的元件,否則它會採用檢視區。

摘要

函式

斷言動態修補將在 timeout 毫秒內發生。timeout 的預設值為 ExUnitassert_receive_timeout (100 毫秒)。

斷言動態修補將在 timeout 毫秒內發生至特定路徑。

斷言動態修補已執行,並傳回新路徑。

斷言事件將在 timeout 毫秒內推播。timeout 的預設值為 ExUnitassert_receive_timeout (100 毫秒)。

斷言重新導向將在 timeout 毫秒內發生。timeout 的預設值為 ExUnitassert_receive_timeout (100 毫秒)。

斷言重新導向將在 timeout 毫秒內發生至特定路徑。

斷言重新導向已執行。

傳回一個元素來對函式進行作用域。

建立一個檔案輸入元件,以供在表單中測試上傳。

透過 child_id 取得 parent LiveView 中的巢狀 LiveView 子元件。

遵循 render_* 動作或是 {:error, redirect} tuple 中的重新導向。

接收一個 form_element 並聲明 phx-trigger-action 已設定為 true,並於該請求中追蹤。

回傳一個供函式範圍使用的表單元素。

檢查給定的元素是否存在於頁面上。

檢查 view 上是否存在具有 text_filterselector

產生一個已連接的 LiveView 程序。

回傳 parent LiveView 中現有的 LiveView 子元件清單。

產生一個已連接的 LiveView 程序,並獨立掛載為唯一的渲染元素。

在不同的 LiveView 中執行 Live 重新導向。

開啟預設瀏覽器以顯示 view_or_element 目前的 HTML。

回傳透過 page_title 指派所更新的最新標題。

執行預檢視上傳請求。

放置於 LiveView 連線中使用的連線參數。

放置 given form 元素的提交者 element_or_selector

否認已執行至指定路徑的重新導向。

回傳渲染視圖或元素的 HTML 字串。

等待給定的 LiveView 或元素的所有當前 assign_asyncstart_async

傳送 element 給出的失焦事件,並回傳渲染結果。

將失焦事件傳送至視圖,並回傳渲染結果。

傳送 element 給出的表單變更事件,並回傳渲染結果。

將表單變更事件傳送至視圖,並回傳渲染結果。

傳送 element 給出的按一下事件,並回傳渲染結果。

傳送點擊 事件檢視,並具有 ,然後傳回渲染的結果。

傳送由 element 給出的焦點事件,然後傳回渲染的結果。

傳送焦點事件至檢視,並傳回渲染的結果。

傳送掛鉤事件至檢視或元素,並傳回渲染的結果。

傳送由 element 給出的鍵盤按下事件,然後傳回渲染的結果。

傳送鍵盤按下事件至檢視,並傳回渲染的結果。

傳送由 element 給出的鍵盤鬆開事件,然後傳回渲染的結果。

傳送鍵盤鬆開事件至檢視,並傳回渲染的結果。

模擬至指定 路徑live_patch,並傳回渲染的結果。

傳送由 element 給出的表單提交事件,然後傳回渲染的結果。

傳送表單提交事件至檢視,並傳回渲染的結果。

執行檔案輸入上傳,並渲染結果。

將渲染的範本轉換成字串。

接收表單元素,並透過外掛模組管線提交 HTTP 要求。

設定檢視的事件目標。

函式

連結到此函式

assert_patch(view, timeout \\ Application.fetch_env!(:ex_unit, :assert_receive_timeout))

檢視原始碼

斷言動態修補將在 timeout 毫秒內發生。timeout 的預設值為 ExUnitassert_receive_timeout (100 毫秒)。

它傳回了新的路徑。

若要聲明快閃訊息,您可以聲明渲染的 LiveView 的結果。

範例

render_click(view, :event_that_triggers_patch)
assert_patch view

render_click(view, :event_that_triggers_patch)
assert_patch view, 30

render_click(view, :event_that_triggers_patch)
path = assert_patch view
assert path =~ ~r/path/+/
連結到此函式

assert_patch(view, to, timeout)

檢視原始碼

斷言動態修補將在 timeout 毫秒內發生至特定路徑。

預設 逾時ExUnitassert_receive_timeout (100 毫秒)。

它傳回了新的路徑。

若要聲明快閃訊息,您可以聲明渲染的 LiveView 的結果。

範例

render_click(view, :event_that_triggers_patch)
assert_patch view, "/path"

render_click(view, :event_that_triggers_patch)
assert_patch view, "/path", 30
連結到此函式

assert_patched(view, to)

檢視原始碼

斷言動態修補已執行,並傳回新路徑。

若要聲明快閃訊息,您可以聲明渲染的 LiveView 的結果。

範例

render_click(view, :event_that_triggers_redirect)
assert_patched view, "/path"
連結到此巨集

assert_push_event(view, event, payload, timeout \\ Application.fetch_env!(:ex_unit, :assert_receive_timeout))

檢視原始碼 (巨集)

斷言事件將在 timeout 毫秒內推播。timeout 的預設值為 ExUnitassert_receive_timeout (100 毫秒)。

範例

assert_push_event view, "scores", %{points: 100, user: "josé"}
連結到此函式

assert_redirect(view, timeout \\ Application.fetch_env!(:ex_unit, :assert_receive_timeout))

檢視原始碼

斷言重新導向將在 timeout 毫秒內發生。timeout 的預設值為 ExUnitassert_receive_timeout (100 毫秒)。

它傳回一個包含新路徑和該重新導向的快閃訊息(若有)的 tuple。請注意快閃訊息會包含字串金鑰。

範例

render_click(view, :event_that_triggers_redirect)
{path, flash} = assert_redirect view
assert flash["info"] == "Welcome"
assert path =~ ~r/path\/\d+/

render_click(view, :event_that_triggers_redirect)
assert_redirect view, 30
連結到此函式

assert_redirect(view, to, timeout)

檢視原始碼

斷言重新導向將在 timeout 毫秒內發生至特定路徑。

預設 逾時ExUnitassert_receive_timeout (100 毫秒)。

它傳回該重新導向的快閃訊息(若有)。請注意快閃訊息會包含字串金鑰。

範例

render_click(view, :event_that_triggers_redirect)
flash = assert_redirect view, "/path"
assert flash["info"] == "Welcome"

render_click(view, :event_that_triggers_redirect)
assert_redirect view, "/path", 30
連結到此函式

assert_redirected(view, to)

檢視原始碼

斷言重新導向已執行。

它傳回該重新導向的快閃訊息(若有)。請注意快閃訊息會包含字串金鑰。

範例

render_click(view, :event_that_triggers_redirect)
flash = assert_redirected view, "/path"
assert flash["info"] == "Welcome"
連結到此巨集

assert_reply(view, payload, timeout \\ Application.fetch_env!(:ex_unit, :assert_receive_timeout))

檢視原始碼 (巨集)

斷言已從 handle_event 回呼傳回一個勾子回覆。

預設 逾時ExUnitassert_receive_timeout (100 毫秒)。

範例

assert_reply view, %{result: "ok", transaction_id: _}
連結到此函式

element(view, selector, text_filter \\ nil)

檢視原始碼

傳回一個元素來對函式進行作用域。

它會預期現有的 LiveView、查詢選擇器和文字篩選器。

可以提供一個選用文字篩選器來依查詢選擇器篩選結果。如果文字篩選器是字串或正則表示式,它會配對任何包含字串(包含當成子字串)或符合正則表示式的元素。

因此包含「未開啟」文字的連結會符合 element("a", "opened")。為了避免這個情況,正則表示式可以指定「opened」會出現在沒有「un」這個字首的位置。舉例來說,element("a", ~r{(?<!un)opened})。但加入 HTML 屬性會比較清楚,這樣元素比較容易選擇。

套用文字篩選器之後,只能剩一個元素,否則會引發錯誤。

如果沒有提供文字篩選器,那麼查詢選擇器本身必須傳回一個元素。

assert view
      |> element("#term > :first-child", "Increment")
      |> render() =~ "Increment</a>"

也支援屬性選擇器,可以用於特殊狀況,例如包含句號的 id。

assert view
       |> element(~s{[href="/foo"][id="foo.bar.baz"]})
       |> render() =~ "Increment</a>"
連結到此巨集

file_input(view, form_selector, name, entries)

檢視原始碼 (巨集)

建立一個檔案輸入元件,以供在表單中測試上傳。

給定表單 DOM 選擇器、上傳名稱和一個包含上傳的用戶端中繼資料清單的對應清單之後,傳回的文件輸入可以傳渡し給 render_upload/2

用戶端中繼資料格式如下

  • :last_modified - 最後修改時間戳記
  • :name - 檔案名稱
  • :content - 檔案的二進制內容
  • :size - 內容的位元組大小
  • :type - 檔案的 MIME 類型
  • :relative_path - 用於模擬 webkitdirectory 中繼資料
  • :meta - 用戶端傳送的選用中繼資料

範例

avatar = file_input(lv, "#my-form-id", :avatar, [%{
  last_modified: 1_594_171_879_000,
  name: "myfile.jpeg",
  content: File.read!("myfile.jpg"),
  size: 1_396_009,
  type: "image/jpeg"
}])

assert render_upload(avatar, "myfile.jpeg") =~ "100%"
連結到此函式

find_live_child(parent, child_id)

檢視原始碼

透過 child_id 取得 parent LiveView 中的巢狀 LiveView 子元件。

範例

{:ok, view, _html} = live(conn, "/thermo")
assert clock_view = find_live_child(view, "clock")
assert render_click(clock_view, :snooze) =~ "snoozing"
連結到此巨集

follow_redirect(reason, conn, to \\ nil)

檢視原始碼 (巨集)

遵循 render_* 動作或是 {:error, redirect} tuple 中的重新導向。

想像你有一個 LiveView 重新導向到 render_click 事件。你可以follow_redirect/3 透過呼叫 render_click 事件後立即重新導向

live_view
|> render_click("redirect")
|> follow_redirect(conn)

或者在錯誤元組的情況下

assert {:error, {:redirect, %{to: "/somewhere"}}} = result = live(conn, "my-path")
{:ok, view, html} = follow_redirect(result, conn)

follow_redirect/3 預期連線作為第二個參數。這條連線將用於執行底層請求。

如果 LiveView 使用 live 重新導向,這個巨集會回傳含有新 LiveView 內容的 {:ok, live_view, disconnected_html},與 live/3 巨集相同。如果 LiveView 使用常規重新導向,這個巨集會回傳含有重新導向頁面的 {:ok, conn}。在其他任何情況下,這個巨集會產生異常。

最後,請注意你可以透過傳遞第三個參數來選擇你正在被重新導向到的路徑

live_view
|> render_click("redirect")
|> follow_redirect(conn, "/redirected/page")
連結到此巨集

follow_trigger_action(form, conn)

檢視原始碼 (巨集)

接收一個 form_element 並聲明 phx-trigger-action 已設定為 true,並於該請求中追蹤。

想像你有一個 LiveView 會送出 HTTP 表單。假設它將 phx-trigger-action 設定為 true 作為回應送出事件。你可以像這樣追蹤執行觸發事件

form = form(live_view, selector, %{"form" => "data"})

# First we submit the form. Optionally verify that phx-trigger-action
# is now part of the form.
assert render_submit(form) =~ ~r/phx-trigger-action/

# Now follow the request made by the form
conn = follow_trigger_action(form, conn)
assert conn.method == "POST"
assert conn.params == %{"form" => "data"}
連結到此函式

form(view, selector, form_data \\ %{})

檢視原始碼

回傳一個供函式範圍使用的表單元素。

它預期目前的 LiveView、查詢選擇器和表單資料。查詢選擇器必須回傳一個單一元素。

表單資料將直接針對表單標記進行驗證,並確認你正在更改/送出的資料確實存在,否則會失敗。

範例

assert view
      |> form("#term", user: %{name: "hello"})
      |> render_submit() =~ "Name updated"

這個函式是用來模仿使用者實際上可以做的事情,因此你無法設定隱藏的輸入值。然而,隱藏值可以在呼叫 render_submit/2render_change/2 時給予,請參閱這些函式的文件以取得範例。

檢查給定的元素是否存在於頁面上。

範例

assert view |> element("#some-element") |> has_element?()
連結到此函式

has_element?(view, selector, text_filter \\ nil)

檢視原始碼

檢查 view 上是否存在具有 text_filterselector

更多資訊,請參閱 element/3

範例

assert has_element?(view, "#some-element")
連結到此巨集

live(conn, path \\ nil)

檢視原始碼 (巨集)

產生一個已連接的 LiveView 程序。

如果提供 path,則執行常規 get(conn, path),然後將頁面升級為 LiveView。如果未提供路徑,則假定給定先前已呈現的 %Plug.Conn{},它將立即轉換為 LiveView。

範例

{:ok, view, html} = live(conn, "/path")
assert view.module == MyLive
assert html =~ "the count is 3"

assert {:error, {:redirect, %{to: "/somewhere"}}} = live(conn, "/path")

回傳 parent LiveView 中現有的 LiveView 子元件清單。

子代按其在已呈現 HTML 中出現的順序傳回。

範例

{:ok, view, _html} = live(conn, "/thermo")
assert [clock_view] = live_children(view)
assert render_click(clock_view, :snooze) =~ "snoozing"
連結到此巨集

live_isolated(conn, live_view, opts \\ [])

檢視原始程式碼 (巨集)

產生一個已連接的 LiveView 程序,並獨立掛載為唯一的渲染元素。

適用於測試無法直接路由的 LiveView,例如那些建置為小元件,以便在多個父代中重複使用。如果可行,建議在任何時候測試可路由 LiveView,因為 live navigation 等功能需要可路由 LiveView。

選項

  • :session - 傳遞給 LiveView 的工作階段

所有其他選項都會轉發給 LiveView 以進行呈現。請參閱 Phoenix.Component.live_render/3 以取得支援的呈現選項清單。

範例

{:ok, view, html} =
  live_isolated(conn, MyAppWeb.ClockLive, session: %{"tz" => "EST"})

使用 put_connect_params/2 來將連線參數放入呼叫 Phoenix.LiveView.get_connect_params/1,它位於 Phoenix.LiveView.mount/3

{:ok, view, html} =
  conn
  |> put_connect_params(%{"param" => "value"})
  |> live_isolated(AppWeb.ClockLive, session: %{"tz" => "EST"})
連結到此函式

live_redirect(view, opts)

檢視原始碼

在不同的 LiveView 中執行 Live 重新導向。

在相同 live_session 的兩個 LiveView 之間重新導向時,掛接新的 LiveView 並關閉前一個 LiveView,這模仿一般瀏覽器的動態導覽行為。

當嘗試從不同 live_session 的 LiveView 導覽時,傳回錯誤重新導向條件,表示用戶端未能進行 live_redirect

範例

assert {:ok, page_live, _html} = live(conn, "/page/1")
assert {:ok, page2_live, _html} = live(conn, "/page/2")

assert {:error, {:redirect, _}} = live_redirect(page2_live, to: "/admin")
連結到此函式

open_browser(view_or_element, open_fun \\ &open_with_system_cmd/1)

檢視原始碼

開啟預設瀏覽器以顯示 view_or_element 目前的 HTML。

範例

view
|> element("#term > :first-child", "Increment")
|> open_browser()

assert view
       |> form("#term", user: %{name: "hello"})
       |> open_browser()
       |> render_submit() =~ "Name updated"

回傳透過 page_title 指派所更新的最新標題。

範例

render_click(view, :event_that_triggers_page_title_update)
assert page_title(view) =~ "my title"
連結到此函式

preflight_upload(upload)

檢視原始碼

執行預檢視上傳請求。

適用於測試外部上傳程式以擷取 :external 項目元資料。

範例

avatar = file_input(lv, "#my-form-id", :avatar, [%{name: ..., ...}, ...])
assert {:ok, %{ref: _ref, config: %{chunk_size: _}}} = preflight_upload(avatar)
連結到此函式

put_connect_params(conn, params)

檢視原始碼

放置於 LiveView 連線中使用的連線參數。

請參閱 Phoenix.LiveView.get_connect_params/1

連結到此函式

put_submitter(form, element_or_selector)

檢視原始碼

放置 given form 元素的提交者 element_or_selector

提交者是一個在用戶端啟動表單送出事件的元素。當一個提交者放置在使用 form/3 建立的元素中,然後表單通過 render_submit/2 提交時,提交者的名稱/值對將包含在提交事件的有效負載中。

指定的元素或選擇器必須存在於表單中並與以下其中一項相符

  • 一個具有 type="submit"buttoninput 元素。

  • 一個沒有 type 屬性的 button 元素。

範例

form = view |> form("#my-form")

assert form
       |> put_submitter("button[name=example]")
       |> render_submit() =~ "Submitted example"
連結到此函式

refute_redirected(view, to)

檢視原始碼

否認已執行至指定路徑的重新導向。

如果指定的轉址不在郵件信箱中,它會回傳 :ok。

範例

render_click(view, :event_that_triggers_redirect_to_path)
:ok = refute_redirected view, "/wrong_path"
連結到此函式

render(view_or_element)

檢視原始碼

回傳渲染視圖或元素的 HTML 字串。

如果提供了一個檢視,則會呈現整個 LiveView。如果在呼叫 with_target/2 或給定元素後提供一個檢視,則只會回傳該特定內容。

範例

{:ok, view, _html} = live(conn, "/thermo")
assert render(view) =~ ~s|<button id="alarm">Snooze</div>|

assert view
       |> element("#alarm")
       |> render() == "Snooze"
連結到此函式

render_async(view_or_element, timeout \\ Application.fetch_env!(:ex_unit, :assert_receive_timeout))

檢視原始碼

等待給定的 LiveView 或元素的所有當前 assign_asyncstart_async

它在完成後呈現 LiveView 或元素並回傳結果。預設的 timeoutExUnitassert_receive_timeout (100 毫秒)。

範例

{:ok, lv, html} = live(conn, "/path")
assert html =~ "loading data..."
assert render_async(lv) =~ "data loaded!"
連結到此函式

render_blur(element, value \\ %{})

檢視原始碼

傳送 element 給出的失焦事件,並回傳渲染結果。

使用 element/3 建立 element,並且必須指向頁面上具有 phx-blur 屬性的單一元素。然後在 phx-blur 中設定的事件名稱會傳送至適當的 LiveView(或如果 phx-target 根據設定設定,則會傳送至元件)。元素中所有 phx-value-* 條目都以值的形式傳送。可以使用 value 引數提供額外值。

它會回傳整個 LiveView 的內容或 {:error, redirect} 組合。

範例

{:ok, view, html} = live(conn, "/thermo")

assert view
       |> element("#inactive")
       |> render_blur() =~ "Tap to wake"
連結到此函式

render_blur(view, event, value)

檢視原始碼

將失焦事件傳送至視圖,並回傳渲染結果。

它會回傳整個 LiveView 的內容或 {:error, redirect} 組合。

範例

{:ok, view, html} = live(conn, "/thermo")
assert html =~ "The temp is: 30℉"
assert render_blur(view, :inactive) =~ "Tap to wake"
連結到此函式

render_change(element, value \\ %{})

檢視原始碼

傳送 element 給出的表單變更事件,並回傳渲染結果。

使用 element/3 建立 element,並且必須指向頁面上具有 phx-change 屬性的單一元素。然後在 phx-change 中設定的事件名稱會傳送至適當的 LiveView(或如果 phx-target 根據設定設定,則會傳送至元件)。元素中所有 phx-value-* 條目都以值的形式傳送。

如果你需要傳遞任何額外值或元資料(例如「_target」參數),你可以透過在 value 引數下提供映射來執行此操作。

它會回傳整個 LiveView 的內容或 {:error, redirect} 組合。

範例

{:ok, view, html} = live(conn, "/thermo")

assert view
       |> element("form")
       |> render_change(%{deg: 123}) =~ "123 exceeds limits"

# Passing metadata
{:ok, view, html} = live(conn, "/thermo")

assert view
       |> element("form")
       |> render_change(%{_target: ["deg"], deg: 123}) =~ "123 exceeds limits"

render_submit/2 一樣,隱藏的輸入欄位值可以提供給像這樣的

refute view
      |> form("#term", user: %{name: "hello"})
      |> render_change(%{user: %{"hidden_field" => "example"}}) =~ "can't be blank"
連結到此函式

render_change(view, event, value)

檢視原始碼

將表單變更事件傳送至視圖,並回傳渲染結果。

它會回傳整個 LiveView 的內容或 {:error, redirect} 組合。

範例

{:ok, view, html} = live(conn, "/thermo")
assert html =~ "The temp is: 30℉"
assert render_change(view, :validate, %{deg: 123}) =~ "123 exceeds limits"
連結到此函式

render_click(element, value \\ %{})

檢視原始碼

傳送 element 給出的按一下事件,並回傳渲染結果。

element 透過 element/3 建立,並必須指向頁面上有 phx-click 屬性的單一元素。接著在 phx-click 上設定的事件名稱會送到適當的 LiveView(或元件,如果 phx-target 相應設定)。在元素中的所有 phx-value-* 項目都會當成值傳送。額外的值可以使用 value 參數提供。

如果元素沒有 phx-click 屬性但它是連結(<a> 標籤),連結會相應地遵循

  • 如果連結是 live_patch,目前的檢視會被修補
  • 如果連結是 live_redirect,此函式將傳回 {:error, {:live_redirect, %{to: url}}},後續可以使用 follow_redirect/2 遵循
  • 如果連結是一般的連結,此函式將傳回 {:error, {:redirect, %{to: url}}},後續可以使用 follow_redirect/2 遵循

它會回傳整個 LiveView 的內容或 {:error, redirect} 組合。

範例

{:ok, view, html} = live(conn, "/thermo")

assert view
       |> element("button", "Increment")
       |> render_click() =~ "The temperature is: 30℉"
連結到此函式

render_click(view, event, value)

檢視原始碼

傳送點擊 事件檢視,並具有 ,然後傳回渲染的結果。

它會回傳整個 LiveView 的內容或 {:error, redirect} 組合。

範例

{:ok, view, html} = live(conn, "/thermo")
assert html =~ "The temperature is: 30℉"
assert render_click(view, :inc) =~ "The temperature is: 31℉"
連結到此巨集

render_component(component, assigns \\ Macro.escape(%{}), opts \\ [])

檢視原始碼 (巨集)

渲染組件。

第一個參數可以是函式元件,或匿名函式

assert render_component(&Weather.city/1, name: "Kraków") =~
         "some markup in component"

或是以模組儲存狀態元件。在這種情況下,函式會掛載、更新和呈現元件。:id 選項是必要的參數

assert render_component(MyComponent, id: 123, user: %User{}) =~
         "some markup in component"

如果元件使用路由器,你可以將它當成參數傳入

assert render_component(MyComponent, %{id: 123, user: %User{}}, router: SomeRouter) =~
         "some markup in component"
連結到此函式

render_focus(element, value \\ %{})

檢視原始碼

傳送由 element 給出的焦點事件,然後傳回渲染的結果。

element 透過 element/3 建立,並必須指向頁面上有 phx-focus 屬性的單一元素。接著在 phx-focus 上設定的事件名稱會送到適當的 LiveView(或元件,如果 phx-target 相應設定)。在元素中的所有 phx-value-* 項目都會當成值傳送。額外的值可以使用 value 參數提供。

它會回傳整個 LiveView 的內容或 {:error, redirect} 組合。

範例

{:ok, view, html} = live(conn, "/thermo")

assert view
       |> element("#inactive")
       |> render_focus() =~ "Tap to wake"
連結到此函式

render_focus(view, event, value)

檢視原始碼

傳送焦點事件至檢視,並傳回渲染的結果。

它會回傳整個 LiveView 的內容或 {:error, redirect} 組合。

範例

{:ok, view, html} = live(conn, "/thermo")
assert html =~ "The temp is: 30℉"
assert render_focus(view, :inactive) =~ "Tap to wake"
連結到此函式

render_hook(view_or_element, event, value \\ %{})

檢視原始碼

傳送掛鉤事件至檢視或元素,並傳回渲染的結果。

它會回傳整個 LiveView 的內容或 {:error, redirect} 組合。

範例

{:ok, view, html} = live(conn, "/thermo")
assert html =~ "The temp is: 30℉"
assert render_hook(view, :refresh, %{deg: 32}) =~ "The temp is: 32℉"

如果您要將事件從 Hook 推送至元件,您必須傳入一個 element,使用 element/3 建立,作為第一個參數,並且它必須指向頁面上具有 phx-target 屬性的單一元素

{:ok, view, _html} = live(conn, "/thermo")
assert view
       |> element("#thermo-component")
       |> render_hook(:refresh, %{deg: 32}) =~ "The temp is: 32℉"
連結到此函式

render_keydown(element, value \\ %{})

檢視原始碼

傳送由 element 給出的鍵盤按下事件,然後傳回渲染的結果。

使用 element/3 建立 element,並且必須指向頁面上具有 phx-keydownphx-window-keydown 屬性的單一元件。然後,於 phx-keydown 設定的事件名稱傳送到適當的 LiveView(或元件,如果 phx-target 適當地設定了)。元素中的所有 phx-value-* 項目都將做為值傳送。額外的值可以使用 value 參數提供。

它會回傳整個 LiveView 的內容或 {:error, redirect} 組合。

範例

{:ok, view, html} = live(conn, "/thermo")
assert html =~ "The temp is: 30℉"
assert view |> element("#inc") |> render_keydown() =~ "The temp is: 31℉"
連結到此函式

render_keydown(view, event, value)

檢視原始碼

傳送鍵盤按下事件至檢視,並傳回渲染的結果。

它會回傳整個 LiveView 的內容或 {:error, redirect} 組合。

範例

{:ok, view, html} = live(conn, "/thermo")
assert html =~ "The temp is: 30℉"
assert render_keydown(view, :inc) =~ "The temp is: 31℉"
連結到此函式

render_keyup(element, value \\ %{})

檢視原始碼

傳送由 element 給出的鍵盤鬆開事件,然後傳回渲染的結果。

使用 element/3 建立 element,並且必須指向頁面上具有 phx-keyupphx-window-keyup 屬性的單一元件。然後,於 phx-keyup 設定的事件名稱傳送到適當的 LiveView(或元件,如果 phx-target 適當地設定了)。元素中的所有 phx-value-* 項目都將做為值傳送。額外的值可以使用 value 參數提供。

它會回傳整個 LiveView 的內容或 {:error, redirect} 組合。

範例

{:ok, view, html} = live(conn, "/thermo")
assert html =~ "The temp is: 30℉"
assert view |> element("#inc") |> render_keyup() =~ "The temp is: 31℉"
連結到此函式

render_keyup(view, event, value)

檢視原始碼

傳送鍵盤鬆開事件至檢視,並傳回渲染的結果。

它會回傳整個 LiveView 的內容或 {:error, redirect} 組合。

範例

{:ok, view, html} = live(conn, "/thermo")
assert html =~ "The temp is: 30℉"
assert render_keyup(view, :inc) =~ "The temp is: 31℉"
連結到此函式

render_patch(view, path)

檢視原始碼

模擬至指定 路徑live_patch,並傳回渲染的結果。

連結到此函式

render_submit(element, value \\ %{})

檢視原始碼

傳送由 element 給出的表單提交事件,然後傳回渲染的結果。

使用 element/3 建立 element,並且必須指向頁面上具有 phx-submit 屬性的單一元件。然後,於 phx-submit 設定的事件名稱傳送到適當的 LiveView(或元件,如果 phx-target 適當地設定了)。元素中的所有 phx-value-* 項目都將做為值傳送。額外的值,包括隱藏的輸入欄位,可以使用 value 參數提供。

它會回傳整個 LiveView 的內容或 {:error, redirect} 組合。

範例

{:ok, view, html} = live(conn, "/thermo")

assert view
       |> element("form")
       |> render_submit(%{deg: 123, avatar: upload}) =~ "123 exceeds limits"

透過一些隱藏的輸入值提交表單

assert view
       |> form("#term", user: %{name: "hello"})
       |> render_submit(%{user: %{"hidden_field" => "example"}}) =~ "Name updated"

使用 put_submitter/2 透過特定提交元素提交表單

assert view
       |> form("#term", user: %{name: "hello"})
       |> put_submitter("button[name=example_action]")
       |> render_submit() =~ "Action taken"
連結到此函式

render_submit(view, event, value)

檢視原始碼

傳送表單提交事件至檢視,並傳回渲染的結果。

它會回傳整個 LiveView 的內容或 {:error, redirect} 組合。

範例

{:ok, view, html} = live(conn, "/thermo")
assert html =~ "The temp is: 30℉"
assert render_submit(view, :refresh, %{deg: 32}) =~ "The temp is: 32℉"
連結到此函式

render_upload(upload, entry_name, percent \\ 100)

檢視原始碼

執行檔案輸入上傳,並渲染結果。

參閱 file_input/4 以了解如何建立文件輸入。

範例

給定下列 LiveView 範本

<%= for entry <- @uploads.avatar.entries do %>
    <%= entry.name %>: <%= entry.progress %>%
<% end %>

您的測試案例可以斷言已上傳的內容

avatar = file_input(lv, "#my-form-id", :avatar, [
  %{
    last_modified: 1_594_171_879_000,
    name: "myfile.jpeg",
    content: File.read!("myfile.jpg"),
    size: 1_396_009,
    type: "image/jpeg"
  }
])

assert render_upload(avatar, "myfile.jpeg") =~ "100%"

預設情況下,整個檔案會分塊傳輸到伺服器,但可以傳遞要分塊傳輸的百分比,以測試分塊上傳

assert render_upload(avatar, "myfile.jpeg", 49) =~ "49%"
assert render_upload(avatar, "myfile.jpeg", 51) =~ "100%"

在對上傳如何在伺服器端處理做出斷言之前,你將需要呼叫 render_submit/1

如果上傳進度回呼發布導航、修補或重新導向,將會傳回下列內容

  • 如果導航為 live_patch,將會修補目前的檢視
  • 如果導航為 live_redirect,這個函式將傳回 {:error, {:live_redirect, %{to: url}}},可以搭配 follow_redirect/2 使用。
  • 如果導航為一般重新導向,這個函式將傳回 {:error, {:redirect, %{to: url}}},可以搭配 follow_redirect/2 使用。
連結到此函式

rendered_to_string(rendered)

檢視原始碼

將渲染的範本轉換成字串。

範例

import Phoenix.Component
import Phoenix.LiveViewTest

test "greets" do
  assigns = %{}
  assert rendered_to_string(~H"""
         <MyComponents.greet name="Mary" />
         """) ==
           "<div>Hello, Mary!</div>"
end
連結到此巨集

submit_form(form, conn)

檢視來源 (巨集)

接收表單元素,並透過外掛模組管線提交 HTTP 要求。

假設你有一個 LiveView,會驗證表單資料,但透過一般表單 action 屬性將表單提交至控制器。這種情況特別有用,尤其是當表單提交結果需要寫入外掛程式工作階段時。

你可以搭配 %Plug.Conn{} 來提交表單,如下所示

form = form(live_view, selector, %{"form" => "data"})

# Now submit the LiveView form to the plug pipeline
conn = submit_form(form, conn)
assert conn.method == "POST"
assert conn.params == %{"form" => "data"}
連結到此函式

with_target(view, target)

檢視原始碼

設定檢視的事件目標。

這樣會在測試中直接模擬 phx-target,不需要將事件派發至特定元素。這可以協助針對一個或多個元件同時呼叫事件

view
|> with_target("#user-1,#user-2")
|> render_click("Hide", %{})