
- ReactJS 教程
- ReactJS - 首頁
- ReactJS - 簡介
- ReactJS - 路線圖
- ReactJS - 安裝
- ReactJS - 特性
- ReactJS - 優點與缺點
- ReactJS - 架構
- ReactJS - 建立 React 應用
- ReactJS - JSX
- ReactJS - 元件
- ReactJS - 巢狀元件
- ReactJS - 使用新建立的元件
- ReactJS - 元件集合
- ReactJS - 樣式
- ReactJS - 屬性 (props)
- ReactJS - 使用屬性建立元件
- ReactJS - props 驗證
- ReactJS - 建構函式
- ReactJS - 元件生命週期
- ReactJS - 事件管理
- ReactJS - 建立一個事件感知元件
- ReactJS - 在 Expense Manager 應用中引入事件
- ReactJS - 狀態管理
- ReactJS - 狀態管理 API
- ReactJS - 無狀態元件
- ReactJS - 使用 React Hooks 進行狀態管理
- ReactJS - 使用 React Hooks 進行元件生命週期管理
- ReactJS - 佈局元件
- ReactJS - 分頁
- ReactJS - Material UI
- ReactJS - Http 客戶端程式設計
- ReactJS - 表單程式設計
- ReactJS - 受控元件
- ReactJS - 非受控元件
- ReactJS - Formik
- ReactJS - 條件渲染
- ReactJS - 列表
- ReactJS - Keys
- ReactJS - 路由
- ReactJS - Redux
- ReactJS - 動畫
- ReactJS - Bootstrap
- ReactJS - Map
- ReactJS - 表格
- ReactJS - 使用 Flux 管理狀態
- ReactJS - 測試
- ReactJS - CLI 命令
- ReactJS - 構建和部署
- ReactJS - 示例
- Hooks
- ReactJS - Hooks 簡介
- ReactJS - 使用 useState
- ReactJS - 使用 useEffect
- ReactJS - 使用 useContext
- ReactJS - 使用 useRef
- ReactJS - 使用 useReducer
- ReactJS - 使用 useCallback
- ReactJS - 使用 useMemo
- ReactJS - 自定義 Hooks
- ReactJS 高階
- ReactJS - 可訪問性
- ReactJS - 程式碼分割
- ReactJS - Context
- ReactJS - 錯誤邊界
- ReactJS - 轉發 Refs
- ReactJS - 片段
- ReactJS - 高階元件
- ReactJS - 與其他庫整合
- ReactJS - 最佳化效能
- ReactJS - Profiler API
- ReactJS - Portals
- ReactJS - 無 ES6 ECMAScript 的 React
- ReactJS - 無 JSX 的 React
- ReactJS - 調和
- ReactJS - Refs 和 DOM
- ReactJS - 渲染 Props
- ReactJS - 靜態型別檢查
- ReactJS - 嚴格模式
- ReactJS - Web Components
- 其他概念
- ReactJS - 日期選擇器
- ReactJS - Helmet
- ReactJS - 內聯樣式
- ReactJS - PropTypes
- ReactJS - BrowserRouter
- ReactJS - DOM
- ReactJS - 輪播圖
- ReactJS - 圖示
- ReactJS - 表單元件
- ReactJS - 參考 API
- ReactJS 有用資源
- ReactJS - 快速指南
- ReactJS - 有用資源
- ReactJS - 討論
ReactJS - testInstance.instance 屬性
元件例項對於類元件非常重要,因為它有助於管理該特定元件的內部狀態和行為。當我們在類元件內部引用 this 時,我們指的是它的例項。這使我們能夠與元件的狀態、生命週期方法和其他功能進行互動。
在 React 測試中,有一個 testInstance.instance 的概念。此屬性提供了對與特定測試例項相關的元件例項的訪問。它允許我們在測試期間檢查和互動元件的內部工作原理。
語法
testInstance.instance
引數
testInstance - 表示測試環境中渲染的 React 元件。
.instance - 一個屬性或方法,允許我們訪問正在測試的 React 元件的實際例項。
與該測試例項關聯的元件例項。因為函式元件沒有例項,所以它只適用於類元件。它等效於給定元件內的 this 值。
返回值
testInstance.instance 返回與特定測試例項相關的元件例項。它提供了對 React 元件的基礎例項的訪問,尤其是在測試方面。
示例
示例 - 測試元件狀態
在這個示例中,我們將建立一個 Counter 應用,其中我們將有一個簡單的 React 類元件來管理計數器狀態。它將有一個方法來遞增計數器值。我們還將為該元件建立一個測試檔案。該測試將確保當呼叫遞增方法時,元件正確地遞增計數器。為此,我們將使用 testInstance.instance 訪問元件例項並觸發遞增方法。因此,Counter 元件及其測試檔案的程式碼如下所示:
Counter.js
import React, { Component } from 'react'; class Counter extends Component { constructor() { super(); this.state = { count: 0 }; } increment() { this.setState((prevState) => ({ count: prevState.count + 1 })); } render() { return ( <div> <p>Count: {this.state.count}</p> </div> ); } } export default Counter;
Counter.test.js
import { render, screen } from '@testing-library/react'; import Counter from './Counter'; test('increments the count', () => { const { testInstance } = render(<Counter />); // Trigger the increment method testInstance.instance.increment(); // Check if the count has been updated expect(screen.getByText(/Count:/).textContent).toBe('Count: 1'); });
輸出

示例 - 測試元件生命週期
現在我們將建立一個 LifecycleExample 應用,其中我們將有一個 React 類元件,在掛載後顯示一條訊息。它將利用 componentDidMount 生命週期方法在掛載後更新狀態。其次,我們還將建立它的測試檔案,以透過使用 testInstance.instance 訪問元件例項來檢查元件的生命週期。它將驗證狀態是否在元件掛載後按預期更新,並檢查渲染的輸出是否與更新後的狀態匹配。因此,程式碼如下所示:
LifecycleExample.js
import React, { Component } from 'react'; class LifecycleExample extends Component { constructor() { super(); this.state = { message: '' }; } componentDidMount() { this.setState({ message: 'Component has mounted!' }); } render() { return <p>{this.state.message}</p>; } } export default LifecycleExample;
LifecycleExample.test.js
import { render, screen } from '@testing-library/react'; import LifecycleExample from './LifecycleExample'; test('checks component lifecycle', () => { const { testInstance } = render(<LifecycleExample />); // Check the state after mounting expect(testInstance.instance.state.message).toBe('Component has mounted!'); // Check if the rendered output matches the updated state expect(screen.getByText(/Component has mounted!/).textContent).toBe('Component has mounted!'); });
輸出

示例 - 與元件方法互動
在第三個示例中,我們將有一個 ClickButton 應用,它是一個 React 類元件,用於表示一個按鈕,當單擊它時切換其狀態。它還將有一個方法 handleClick,它將更新狀態以顯示該按鈕已被單擊。
接下來,我們將建立其相應的測試檔案,以透過使用 fireEvent.click 方法單擊按鈕來與元件進行互動。然後,它將使用 testInstance.instance 檢查元件狀態是否已按預期更新。
ClickButton.js
import React, { Component } from 'react'; class ClickButton extends Component { constructor() { super(); this.state = { clicked: false }; } handleClick() { this.setState({ clicked: true }); } render() { return ( <button onClick={() => this.handleClick()}> {this.state.clicked ? 'Clicked!' : 'Click me'} </button> ); } } export default ClickButton;
ClickButton.test.js
import { render, fireEvent, screen } from '@testing-library/react'; import ClickButton from './ClickButton'; test('handles button click', () => { const { testInstance } = render(<ClickButton />); // Trigger the handleClick method fireEvent.click(screen.getByText('Click me')); // Check if the component state has been updated expect(testInstance.instance.state.clicked).toBe(true); expect(screen.getByText(/Clicked!/).textContent).toBe('Clicked!'); });
輸出

總結
瞭解 React 中的元件例項對於有效的元件管理和測試非常重要,尤其是在類元件的上下文中。通過了解這個概念,我們將能夠管理 React 應用的複雜性。我們使用 testInstance.instance 方法建立了三個應用。這些應用和測試場景展示了測試 React 元件的各個方面,例如狀態管理、生命週期方法以及與元件方法的互動。testInstance.instance 的使用允許在測試期間完全測試和修改元件內部。