簡單而完整的 React hooks 測試實用程式鼓勵良好的測試實踐。
如果您使用的是目前版本的react-testing-library
,請替換
import { renderHook } from '@testing-library/react-hooks'
和
import { renderHook } from '@testing-library/react'
替換後,可以卸載@testing-library/react-hooks
。
作為 React 18 變更的一部分,已決定該庫提供的renderHook
API 將作為官方添加內容包含在react-testing-library
(PR) 和react-native-testing-library
(PR) 中目的是為我們的用戶提供更有凝聚力和一致的實施。
請耐心等待,我們將在各自的測試庫中完成這些變更。同時你可以安裝@testing-library/react@^13.1
useCounter.js
useCounter.test.js
您正在編寫一個很棒的自訂鉤子並且想要測試它,但是一旦調用它,您就會看到以下錯誤:
不變違規:只能在函數元件體內呼叫掛鉤。
您真的不想只是為了測試這個鉤子而編寫一個組件,並且必須弄清楚如何觸發可以更新鉤子的所有各種方式,特別是考慮到如何將整個事物連接在一起的複雜性。
react-hooks-testing-library
可讓您為 React hooks 建立一個簡單的測試工具,處理在函數元件體內運行它們,並提供各種有用的實用函數來更新輸入和檢索令人驚嘆的輸出自訂掛鉤。該庫旨在提供盡可能接近在真實組件中本地使用鉤子的測試體驗。
使用這個庫,您不必關心如何建立、渲染或與反應組件互動來測試您的鉤子。您可以直接使用鉤子並斷言結果。
useCounter.js
import { useState , useCallback } from 'react'
function useCounter ( ) {
const [ count , setCount ] = useState ( 0 )
const increment = useCallback ( ( ) => setCount ( ( x ) => x + 1 ) , [ ] )
return { count , increment }
}
export default useCounter
useCounter.test.js
import { renderHook , act } from '@testing-library/react-hooks'
import useCounter from './useCounter'
test ( 'should increment counter' , ( ) => {
const { result } = renderHook ( ( ) => useCounter ( ) )
act ( ( ) => {
result . current . increment ( )
} )
expect ( result . current . count ) . toBe ( 1 )
} )
更高級的用法可以在文件中找到。
npm install --save-dev @testing-library/react-hooks
react-hooks-testing-library
未與react
版本捆綁在一起,以允許您安裝要測試的特定版本。它也沒有安裝特定的渲染器,我們目前支援react-test-renderer
和react-dom
。您只需要安裝其中之一,但是,如果您同時安裝了兩者,我們將預設使用react-test-renderer
。有關更多信息,請參閱安裝文件。一般來說,已安裝的react
版本和所選渲染器應該具有相符的版本:
npm install react@^16.9.0
npm install --save-dev react-test-renderer@^16.9.0
注意:
react
、react-test-renderer
和react-dom
支援的最低版本是^16.9.0
。
請參閱 API 參考。
感謝這些優秀的人(表情符號鍵):
麥可·佩珀 ? ? ? | 乙豆腐廣場 | 派崔克·P·亨利 ? ? | 馬修斯馬克斯 | 德魯夫·帕特爾 ? ? | 納撒尼爾·塔克 ? ? | 謝爾蓋·格里先科 ? |
何塞·M·索布雷佩爾 | 馬塞爾·廷納 | 丹尼爾·K. ? | 文斯·馬龍 | 賽巴斯蒂安·韋伯 | 克里斯蒂安·吉爾 | JavaScript 喬 ✅ |
薩拉·達揚 ? | 羅曼·古謝夫 | 亞當·塞克爾 | 佐佐木惠也 | 胡晨 | 喬許 ? ? | 納曼·赫希菲爾德 |
布雷登廳 | 雅各布·M·埃文斯 | 泰格·阿布羅迪 | 阿姆·穆罕默德 | 尤哈娜·賈希艾寧 | 延斯·邁德茨瑪 | 馬可·莫雷蒂 ? |
馬丁·V. | 埃羅扎克 | 尼克·麥柯迪 ? | 艾莉亞 | 麻木86 | 亞歷克斯·楊 ? | 本·蘭伯特 |
大衛喬勒拉特 | 艾文哈蒙 | 傑森布朗 | 丁嘉偉 | 列昂尼德·沙加布季諾夫 | 利維·布徹 | 米歇爾·塞特帕尼 |
山姆 | 塔奈·普拉塔普 | 湯姆·里斯-赫德曼 | 伊克巴爾125 | 懸崖趙卜特 ? | 喬恩‧庫普斯 | 喬納森·佩珀 ? |
貝恩斯 | 米哈伊爾·瓦辛 | 亞歷山大·格比奇 | 喬納森·霍姆斯 | 邁克爾·德博伊 ? | 安東·季諾維耶夫 ? | 瑪麗安娜·埃塞拉特 ? |
馬坦·博倫克勞特 ? | 安德羅格 | 布萊恩·韋恩 ? ? | 羅伯特·斯諾 | 克里斯·陳 | 馬修斯 | 賴樹新 |
該項目遵循所有貢獻者規範。歡迎任何形式的貢獻!
想要貢獻嗎?尋找“Good First Issue”標籤。
請針對錯誤、缺少文件或意外行為提出問題。
查看錯誤
請提出問題以建議新功能。透過新增 ? 對功能請求進行投票。這有助於維護人員優先考慮要做什麼。
查看功能請求
對於與使用庫相關的問題,您可以在此處提出問題,或訪問支援社群:
麻省理工學院