React Testing Library 是一套 DOM Testing Library 工具,希望我們能更關注在用戶的使用操作上,因此提供許多在模擬使用者查詢 DOM 節點的方法,讓開發者針對 DOM 與使用者的操作行為進行測試。
但是 React Testing Library 本身無法運行測試,以及測試是否有通過,需仰賴 Jest 的協作。並且可與 Jest 搭配在不透過瀏覽器的情況下模擬使用者的操作行為(e.g. 點擊按鈕、下拉選單)。
getBy
, queryBy
, findBy
getAllBy
, queryAllBy
, findAllBy
render
, screen
, getBy
如果是使用 create-react-app
建立的專案,通常在建立時就會幫你安裝好 React Testing Library
套件。
可以在 package.json
檔案裡找到:
jest-dom
, user-event
皆為在測試時會一起使用的輔助工具。
若專案中沒有 create-react-app
套件,也可以自行執行 npm 指令進行安裝。
使用React Testing Library
搭配來撰寫測試時,我們可以針對程式碼結構進行思考,如何渲染、模擬行為、驗證結果是否符合預期。
React Testing Library 提供很多方法可以讓我們像使用者一樣選取網頁上的 DOM 元素,讓我們在測試時更切合實際。
getBy
:
getAllBy
:
findBy
:
findAllBy
:
getAllBy
一樣可以選取多個匹配的元素,適合用來選取非同步操作後顯示的元素。queryBy
:
適用於比對是否沒有某個元素時
沒有比對到元素時不會報錯,而是會回傳 null
因不會直接報錯,不建議拿來選取存在的元素
適合與 not
一起搭配使用
queryAllBy
:
–
如何選取:
ByText
:
ByRole
:(需注意套件設定的 Role)
可以透過標籤的角色去尋找想要的元素,角色可以透過此方式去觀看:
叫出開發者工具後在 Elements 底下原先預設 Styles 的地方點擊最右側小箭頭 >> 圖示後選取 Accessibility 。
選取對應的 element 後底下會顯示 Role 角色!
以按鈕舉例可以這樣選取:
如果有多顆按鈕的情況,可以在按鈕上添加 aria-label 屬性後透過 name 去指定:
這邊透過 Antd 的素材庫去舉例,也要特別提醒,如果是透過套件去渲染的元件,套件可能會有多個層級,此時要特別留意要做測試的層級,按照 Select 舉例該 input 可能包在很內層,input 內也有去設定 role 角色:
ByLabelText
:
ByPlaceholderText
:
ByDisplayValue
:
ByAltText
:
ByTitle
:
ByTestId
data-testid
屬性,data-testid
要提前埋在標籤內:
–
選取之前須先觀看頁面上可供選擇的元素
screen.debug()
: