---
# System prepended metadata

title: Jest DOM

---

# Jest DOM

@testing-library/jest-dom 套件庫，提供很多針對 Jest 測試網頁上 **DOM 元素狀態**的匹配器。

來看看 Jest DOM 能做什麼吧！

---
#### 常用方法：

- `toBeDisabled()`：判斷**是否被禁用**
    - 以按鈕舉例：
        
        ```jsx!
        <button type="button" disabled>click</button>
        ```
        
        ```jsx!
        // 透過 getByRole 選取 button 後判斷是否被禁用
        expect(getByRole('button')).toBeDisabled()
        ```
        
- `toBeInTheDocument()`：幫助判斷頁面上**是否存在該元素**。
    - 假使頁面上有 Hello World!! 就可以透過此方式去斷言是否存在：
    
        ```jsx!
        expect(getByText('Hello World!!')).toBeInTheDocument();
        ```
    
- `toBeEnabled` ：判斷**是否未被禁用**
    - 也可直接在 `toBeDisabled()`前加上 `not` 去判斷。
    
    
        ```jsx
        // 判斷未被禁用

        // 1 使用 toBeEnabled
        expect(getByRole('button')).toBeEnabled()

        // 2 使用 toBeDisabled 搭配 not
        expect(getByRole('button')).not.toBeDisabled()
        ```
    
- `toHaveStyle()`：確認元素**是否擁有 style 設定值**，可傳入 css 字串或物件，需要與帶入的值完全匹配才能通過。

    <aside>
    👉 只有 Inline style 可以測， className 內設定的 css 樣式需要另外安裝套件才能測試。
    </aside>
    
--

與**表單**相關：

- `toBeChecked`
    - 檢查 input type 為 `checkbox` 或 `radio` 時是否有屬性 `checked`
    - 自行設定 `role` 為 `checkbox` 或 `radio` 或 `switch` ，且擁有 `aria-checked` 為 `true`
    
- `toBeRequired()` ：判斷**是否必填**，判斷當表單元素是否有 `required` 或 `aria-required="true"`。

- `toBeValid` ：判斷**用戶輸入後的值是否有效**，當 `aria-invalid`
 為 `false`或未設置值時，該值為有效，文件中有特別提到在使用時 [checkValidity()](https://developer.mozilla.org/en-US/docs/Web/Guide/HTML/Constraint_validation) 也必須為 true。
- `toBeInvalid`：
    - 判斷表單輸入的值是否為無效，當 `aria-invalid="true"`時該值為無效，且 [checkValidity()](https://developer.mozilla.org/en-US/docs/Web/Guide/HTML/Constraint_validation) 為 false。
    - 可以使用 not 搭配 toBeValid 來判斷無效的值外也可改為透過 `toBeInvalid()`
- `toHaveErrorMessage`：
    - 當有設定錯誤訊息 `aria-errormessage`且表單值為無效時 `aria-invalid="true"`可透過 `toHaveErrorMessage()`進行測試，該測試是區分大小寫的，如果不想區分大小寫，可以使用正則表達式。

---
參考文章

https://github.com/testing-library/jest-dom
https://testing-library.com/docs/queries/about/