檢視原始碼 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
的預設值為 ExUnit 的 assert_receive_timeout
(100 毫秒)。
斷言動態修補將在 timeout
毫秒內發生至特定路徑。
斷言動態修補已執行,並傳回新路徑。
斷言事件將在 timeout
毫秒內推播。timeout
的預設值為 ExUnit 的 assert_receive_timeout
(100 毫秒)。
斷言重新導向將在 timeout
毫秒內發生。timeout
的預設值為 ExUnit 的 assert_receive_timeout
(100 毫秒)。
斷言重新導向將在 timeout
毫秒內發生至特定路徑。
斷言重新導向已執行。
斷言已從 handle_event
回呼傳回一個勾子回覆。
傳回一個元素來對函式進行作用域。
建立一個檔案輸入元件,以供在表單中測試上傳。
透過 child_id
取得 parent
LiveView 中的巢狀 LiveView 子元件。
遵循 render_*
動作或是 {:error, redirect}
tuple 中的重新導向。
接收一個 form_element
並聲明 phx-trigger-action
已設定為 true,並於該請求中追蹤。
回傳一個供函式範圍使用的表單元素。
檢查給定的元素是否存在於頁面上。
檢查 view
上是否存在具有 text_filter
的 selector
。
產生一個已連接的 LiveView 程序。
回傳 parent
LiveView 中現有的 LiveView 子元件清單。
產生一個已連接的 LiveView 程序,並獨立掛載為唯一的渲染元素。
在不同的 LiveView 中執行 Live 重新導向。
開啟預設瀏覽器以顯示 view_or_element
目前的 HTML。
回傳透過 page_title
指派所更新的最新標題。
執行預檢視上傳請求。
放置於 LiveView 連線中使用的連線參數。
放置 given form
元素的提交者 element_or_selector
。
否認已執行至指定路徑的重新導向。
回傳渲染視圖或元素的 HTML 字串。
等待給定的 LiveView 或元素的所有當前 assign_async
和 start_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
的預設值為 ExUnit 的 assert_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/+/
斷言動態修補將在 timeout
毫秒內發生至特定路徑。
預設 逾時
為 ExUnit 的 assert_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
斷言動態修補已執行,並傳回新路徑。
若要聲明快閃訊息,您可以聲明渲染的 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
的預設值為 ExUnit 的 assert_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
的預設值為 ExUnit 的 assert_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
斷言重新導向將在 timeout
毫秒內發生至特定路徑。
預設 逾時
為 ExUnit 的 assert_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
斷言重新導向已執行。
它傳回該重新導向的快閃訊息(若有)。請注意快閃訊息會包含字串金鑰。
範例
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
回呼傳回一個勾子回覆。
預設 逾時
為 ExUnit 的 assert_receive_timeout
(100 毫秒)。
範例
assert_reply view, %{result: "ok", transaction_id: _}
傳回一個元素來對函式進行作用域。
它會預期現有的 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>"
建立一個檔案輸入元件,以供在表單中測試上傳。
給定表單 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%"
透過 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"
遵循 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")
接收一個 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"}
回傳一個供函式範圍使用的表單元素。
它預期目前的 LiveView、查詢選擇器和表單資料。查詢選擇器必須回傳一個單一元素。
表單資料將直接針對表單標記進行驗證,並確認你正在更改/送出的資料確實存在,否則會失敗。
範例
assert view
|> form("#term", user: %{name: "hello"})
|> render_submit() =~ "Name updated"
這個函式是用來模仿使用者實際上可以做的事情,因此你無法設定隱藏的輸入值。然而,隱藏值可以在呼叫 render_submit/2
或 render_change/2
時給予,請參閱這些函式的文件以取得範例。
檢查給定的元素是否存在於頁面上。
範例
assert view |> element("#some-element") |> has_element?()
檢查 view
上是否存在具有 text_filter
的 selector
。
更多資訊,請參閱 element/3
。
範例
assert has_element?(view, "#some-element")
產生一個已連接的 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"
產生一個已連接的 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"})
在不同的 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")
開啟預設瀏覽器以顯示 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"
執行預檢視上傳請求。
適用於測試外部上傳程式以擷取 :external
項目元資料。
範例
avatar = file_input(lv, "#my-form-id", :avatar, [%{name: ..., ...}, ...])
assert {:ok, %{ref: _ref, config: %{chunk_size: _}}} = preflight_upload(avatar)
放置於 LiveView 連線中使用的連線參數。
放置 given form
元素的提交者 element_or_selector
。
提交者是一個在用戶端啟動表單送出事件的元素。當一個提交者放置在使用 form/3
建立的元素中,然後表單通過 render_submit/2
提交時,提交者的名稱/值對將包含在提交事件的有效負載中。
指定的元素或選擇器必須存在於表單中並與以下其中一項相符
一個具有
type="submit"
的button
或input
元素。一個沒有
type
屬性的button
元素。
範例
form = view |> form("#my-form")
assert form
|> put_submitter("button[name=example]")
|> render_submit() =~ "Submitted example"
否認已執行至指定路徑的重新導向。
如果指定的轉址不在郵件信箱中,它會回傳 :ok。
範例
render_click(view, :event_that_triggers_redirect_to_path)
:ok = refute_redirected view, "/wrong_path"
回傳渲染視圖或元素的 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_async
和 start_async
。
它在完成後呈現 LiveView 或元素並回傳結果。預設的 timeout
是 ExUnit 的 assert_receive_timeout
(100 毫秒)。
範例
{:ok, lv, html} = live(conn, "/path")
assert html =~ "loading data..."
assert render_async(lv) =~ "data loaded!"
傳送 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"
將失焦事件傳送至視圖,並回傳渲染結果。
它會回傳整個 LiveView 的內容或 {:error, redirect}
組合。
範例
{:ok, view, html} = live(conn, "/thermo")
assert html =~ "The temp is: 30℉"
assert render_blur(view, :inactive) =~ "Tap to wake"
傳送 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"
將表單變更事件傳送至視圖,並回傳渲染結果。
它會回傳整個 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"
傳送 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℉"
傳送點擊 事件
至 檢視
,並具有 值
,然後傳回渲染的結果。
它會回傳整個 LiveView 的內容或 {:error, redirect}
組合。
範例
{:ok, view, html} = live(conn, "/thermo")
assert html =~ "The temperature is: 30℉"
assert render_click(view, :inc) =~ "The temperature is: 31℉"
渲染組件。
第一個參數可以是函式元件,或匿名函式
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"
傳送由 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"
傳送焦點事件至檢視,並傳回渲染的結果。
它會回傳整個 LiveView 的內容或 {:error, redirect}
組合。
範例
{:ok, view, html} = live(conn, "/thermo")
assert html =~ "The temp is: 30℉"
assert render_focus(view, :inactive) =~ "Tap to wake"
傳送掛鉤事件至檢視或元素,並傳回渲染的結果。
它會回傳整個 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℉"
傳送由 element
給出的鍵盤按下事件,然後傳回渲染的結果。
使用 element/3
建立 element
,並且必須指向頁面上具有 phx-keydown
或 phx-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℉"
傳送鍵盤按下事件至檢視,並傳回渲染的結果。
它會回傳整個 LiveView 的內容或 {:error, redirect}
組合。
範例
{:ok, view, html} = live(conn, "/thermo")
assert html =~ "The temp is: 30℉"
assert render_keydown(view, :inc) =~ "The temp is: 31℉"
傳送由 element
給出的鍵盤鬆開事件,然後傳回渲染的結果。
使用 element/3
建立 element
,並且必須指向頁面上具有 phx-keyup
或 phx-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℉"
傳送鍵盤鬆開事件至檢視,並傳回渲染的結果。
它會回傳整個 LiveView 的內容或 {:error, redirect}
組合。
範例
{:ok, view, html} = live(conn, "/thermo")
assert html =~ "The temp is: 30℉"
assert render_keyup(view, :inc) =~ "The temp is: 31℉"
模擬至指定 路徑
的 live_patch
,並傳回渲染的結果。
傳送由 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"
傳送表單提交事件至檢視,並傳回渲染的結果。
它會回傳整個 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℉"
執行檔案輸入上傳,並渲染結果。
參閱 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
使用。
將渲染的範本轉換成字串。
範例
import Phoenix.Component
import Phoenix.LiveViewTest
test "greets" do
assigns = %{}
assert rendered_to_string(~H"""
<MyComponents.greet name="Mary" />
""") ==
"<div>Hello, Mary!</div>"
end
接收表單元素,並透過外掛模組管線提交 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"}
設定檢視的事件目標。
這樣會在測試中直接模擬 phx-target
,不需要將事件派發至特定元素。這可以協助針對一個或多個元件同時呼叫事件
view
|> with_target("#user-1,#user-2")
|> render_click("Hide", %{})