国产av日韩一区二区三区精品,成人性爱视频在线观看,国产,欧美,日韩,一区,www.成色av久久成人,2222eeee成人天堂

首頁 web前端 js教程 測試 ReactJS 上下文 - 測試替身指南

測試 ReactJS 上下文 - 測試替身指南

Dec 05, 2024 am 02:03 AM

在這篇文章中,我將逐步介紹使用測試庫測試依賴上下文的 React 元件的思考過程。我的目標(biāo)是探索一種不同的方法來測試這些元件,檢查使用模擬與不模擬上下文的測試的優(yōu)缺點(diǎn)。我們將研究每種方法如何影響測試的可靠性,並且我將分享關(guān)於何時(shí)以及為什麼一種方法在實(shí)際應(yīng)用中可能比另一種方法更有益的見解。

你應(yīng)該知道什麼

  • reactjs 是用來做什麼的(可能你已經(jīng)寫過一些應(yīng)用了)
  • 什麼是 vitest

什麼是反應(yīng)上下文

ReactJS 上下文的出現(xiàn)是為了解決 ReactJS 元件結(jié)構(gòu)中的一個(gè)常見問題:道具鑽探。當(dāng)我們有一系列組件需要存取同一組資料時(shí),就會(huì)發(fā)生道具鑽探。上下文機(jī)制允許元件共享同一組數(shù)據(jù),只要上下文本身是第一個(gè)後代。

在reactjs文檔中,使用了保存主題的上下文,因?yàn)槠渌M件可能需要此信息,文檔使用上下文來處理該信息,而不是通過道具傳遞值。另一個(gè)範(fàn)例是使用上下文來保存應(yīng)用程式的佈局,在 json-tool 範(fàn)例中,App.tsx 使用可用於所有應(yīng)用程式的 DefaultLayout 上下文來包裝應(yīng)用程式。

本範(fàn)例的應(yīng)用程式

下面的範(fàn)例將使用主題應(yīng)用程式。它是一個(gè)允許用戶在淺色/深色主題之間切換的應(yīng)用程式。該應(yīng)用程式也在reactjs官方文件中使用。該應(yīng)用程式由一個(gè)簡單的開關(guān)組成,可在淺色主題模式和深色主題模式之間切換。該應(yīng)用程式非常簡單,我們可以將所有內(nèi)容繪製在一個(gè)檔案中:

import { createContext, useContext, useState } from 'react'
const ThemeContext = createContext('light')

function Page() {
  const theme = useContext(ThemeContext)
  return (
    <div>
      <p>current theme: {theme}</p>
    </div>
  )
}

function App() {
  const [theme, setTheme] = useState('light')
  return (
    <ThemeContext.Provider value={theme}>
      <button
        className={theme}
        onClick={() => setTheme(theme === 'light' ? 'dark' : 'light')}
      >
        Toggle
      </button>
      <Page />
    </ThemeContext.Provider>
  )
}

export default App

在這個(gè)應(yīng)用程式中,我們有兩個(gè)主要元件:App 和 Page。 App 元件作為主要元件,包含目前主題的狀態(tài),可以是「亮」或「暗」。它還包括一個(gè)可在淺色和深色模式之間切換主題的按鈕。 Page 元件是 App 的子元件,它使用主題上下文來顯示目前主題。 App 元件中的按鈕是一個(gè)簡單的切換按鈕,點(diǎn)擊時(shí)會(huì)切換主題並相應(yīng)地更新上下文值。

Testing ReactJS Context - A Guide with test-doubles

在下一節(jié)中,我們將討論對(duì)組件進(jìn)行切片以進(jìn)行測試。

點(diǎn)火測試

通常在任何應(yīng)用程式中,我們都必須專注於我們想要做什麼樣的測試,以及我們想要處理哪個(gè)部分。例如,我們可以針對(duì)單一元件,而不是整個(gè)應(yīng)用程式。在我們的範(fàn)例中,我們將從頁面元件開始。這將需要我們使用測試替身來測試它。

Testing ReactJS Context - A Guide with test-doubles

測試替身來自應(yīng)用程式結(jié)構(gòu)本身,因?yàn)樗Q於上下文,要更改它,上下文中的值也需要更改。

測試雙打

為了開始使用 ReactJS 中的上下文進(jìn)行測試方法,我們將開始編寫第一個(gè)測試:

import { createContext, useContext, useState } from 'react'
const ThemeContext = createContext('light')

function Page() {
  const theme = useContext(ThemeContext)
  return (
    <div>
      <p>current theme: {theme}</p>
    </div>
  )
}

function App() {
  const [theme, setTheme] = useState('light')
  return (
    <ThemeContext.Provider value={theme}>
      <button
        className={theme}
        onClick={() => setTheme(theme === 'light' ? 'dark' : 'light')}
      >
        Toggle
      </button>
      <Page />
    </ThemeContext.Provider>
  )
}

export default App

鑑於淺色主題設(shè)定為 ThemeContext 中的預(yù)設(shè)主題,此測試將按預(yù)期通過。我們甚至可以測試第一個(gè)範(fàn)例,但是,當(dāng)我們對(duì)黑暗主題感興趣時(shí),第二個(gè)測試中的事情會(huì)變得有趣。為了進(jìn)入黑暗主題,我們需要開始使用測試替身,因?yàn)槲覀円蕾?ReactJS 上下文來做到這一點(diǎn)。第二個(gè)測試將 vi.mock 和 vi.mocked 混合在一起。請(qǐng)注意,要編寫的第二個(gè)測試也需要更改第一個(gè)測試。

import { render, screen } from '@testing-library/react'
import { Page } from './Page'

describe('<Page />', () => {
  it('should render light as default theme', () => {
    render(<Page />)
    expect(screen.getByText('current theme: light')).toBeInTheDocument()
  })
})

兩個(gè)測試案例現(xiàn)在都使用假的來測試驅(qū)動(dòng)應(yīng)用程式。如果我們改變上下文的回傳數(shù)據(jù),測試也會(huì)改變。這裡的注意點(diǎn)是:

  • 我們正在嘲笑reactjs上下文,這違背了「不要嘲笑你不擁有的東西」的原則
  • 測試變得更加冗長,因?yàn)槲覀冃枰褂媚M來做到這一點(diǎn)
  • 我們寫的兩個(gè)測試沒有反映使用者與應(yīng)用程式的互動(dòng)。我們知道,當(dāng)按下切換按鈕時(shí),主題將會(huì)改變。

本節(jié)中使用的完整程式碼可在 GitHub 上取得

沒有測試替身

下一個(gè)方法是使用嵌入到我們的應(yīng)用程式中的上下文,而不隔離它或使用任何測試替身。如果我們採用 TDD 的這種方法,我們可以從一個(gè)非常簡單的測試開始,模擬使用者的行為方式:

import { render, screen } from '@testing-library/react'
import { Page } from './Page'
import { useContext } from 'react'

vi.mock('react', () => {
  return {
    ...vi.importActual('react'),
    useContext: vi.fn(),
    createContext: vi.fn()
  }
})

describe('<Page />', () => {
  it('should render light as default theme', () => {
    vi.mocked(useContext).mockReturnValue('light')
    render(<Page />)
    expect(screen.getByText('current theme: light')).toBeInTheDocument()
  })

  it('should render dark theme', () => {
    vi.mocked(useContext).mockReturnValue('dark')
    render(<Page />)
    expect(screen.getByText('current theme: dark')).toBeInTheDocument()
  })
})

然後進(jìn)行第二個(gè)測試,我們希望預(yù)設(shè)燈光主題:

import { render, screen } from '@testing-library/react'
import App from './App'
import userEvent from '@testing-library/user-event'

describe('<App />', () => {
  it('should render toggle button', () => {
    render(<App />)
    expect(screen.getByText('Toggle')).toBeInTheDocument()
  })
})

最後但並非最不重要的主題切換:

import { render, screen } from '@testing-library/react'
import App from './App'
import userEvent from '@testing-library/user-event'

describe('<App />', () => {
  it('should render toggle button', () => {
    render(<App />)
    expect(screen.getByText('Toggle')).toBeInTheDocument()
  })

  it('should render light as default theme', () => {
    render(<App />)
    expect(screen.getByText('current theme: light')).toBeInTheDocument()
  })
})

本攻略注意:

  • 不需要測試替身,它可以用更少的程式碼進(jìn)行測試
  • 測試的行為與使用者在真實(shí)應(yīng)用程式中的行為相符

本節(jié)中使用的完整程式碼可在 GitHub 上取得

每種方法的優(yōu)缺點(diǎn)

在本節(jié)中,我們將討論每種方法針對(duì)不同屬性的優(yōu)缺點(diǎn)。

重構(gòu) props

在上下文中使用測試替身會(huì)使測試對(duì)於這種更改變得脆弱。使用 props 重構(gòu) useContext 的使用會(huì)自動(dòng)使測試失敗,即使行為沒有失敗。使用不使用測試雙精度的選項(xiàng)支援在這個(gè)意義上的重構(gòu)。

建立自訂上下文

使用自訂上下文而不是直接依賴reactjs 的上下文提供者也會(huì)發(fā)生相同的情況。使用不帶測試替身的選項(xiàng)可以進(jìn)行重構(gòu)。

結(jié)論

在本指南中,我們探索瞭如何測試依賴於上下文的組件,而不需要測試替身,使測試更加簡單,更接近真實(shí)的用戶交互,並對(duì)比每種方法的優(yōu)缺點(diǎn)。只要有可能,就應(yīng)遵循反映使用者互動(dòng)的簡單方法。然而,當(dāng)需要測試替身時(shí),應(yīng)該以測試程式碼的可維護(hù)性為目標(biāo)來使用它們。透過簡單的測試可以放心地重構(gòu)生產(chǎn)程式碼。

資源

  • 建立自訂上下文
  • 重構(gòu)目錄
  • 用來尋找如何使用 vitest 模擬模組的特定部分
  • 用於尋找如何解決類型問題
  • 測試庫 userEvent

下一步

  • 嘗試測試涉及多個(gè)上下文或巢狀提供者的更複雜的場景。
  • 雖然我們?cè)诒局改现斜苊饬四M,但在某些情況下模擬是必要的。探索這些場景的高級(jí)模擬技術(shù)。

遵循這些步驟,您可以繼續(xù)提高測試技能並確保您的 React 應(yīng)用程式可以重構(gòu)。

以上是測試 ReactJS 上下文 - 測試替身指南的詳細(xì)內(nèi)容。更多資訊請(qǐng)關(guān)注PHP中文網(wǎng)其他相關(guān)文章!

本網(wǎng)站聲明
本文內(nèi)容由網(wǎng)友自願(yuàn)投稿,版權(quán)歸原作者所有。本站不承擔(dān)相應(yīng)的法律責(zé)任。如發(fā)現(xiàn)涉嫌抄襲或侵權(quán)的內(nèi)容,請(qǐng)聯(lián)絡(luò)admin@php.cn

熱AI工具

Undress AI Tool

Undress AI Tool

免費(fèi)脫衣圖片

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅(qū)動(dòng)的應(yīng)用程序,用於創(chuàng)建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費(fèi)的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費(fèi)的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強(qiáng)大的PHP整合開發(fā)環(huán)境

Dreamweaver CS6

Dreamweaver CS6

視覺化網(wǎng)頁開發(fā)工具

SublimeText3 Mac版

SublimeText3 Mac版

神級(jí)程式碼編輯軟體(SublimeText3)

Java vs. JavaScript:清除混亂 Java vs. JavaScript:清除混亂 Jun 20, 2025 am 12:27 AM

Java和JavaScript是不同的編程語言,各自適用於不同的應(yīng)用場景。 Java用於大型企業(yè)和移動(dòng)應(yīng)用開發(fā),而JavaScript主要用於網(wǎng)頁開發(fā)。

JavaScript評(píng)論:簡短說明 JavaScript評(píng)論:簡短說明 Jun 19, 2025 am 12:40 AM

JavascriptconcommentsenceenceEncorenceEnterential gransimenting,reading and guidingCodeeXecution.1)單inecommentsareusedforquickexplanations.2)多l(xiāng)inecommentsexplaincomplexlogicorprovideDocumentation.3)

如何在JS中與日期和時(shí)間合作? 如何在JS中與日期和時(shí)間合作? Jul 01, 2025 am 01:27 AM

JavaScript中的日期和時(shí)間處理需注意以下幾點(diǎn):1.創(chuàng)建Date對(duì)像有多種方式,推薦使用ISO格式字符串以保證兼容性;2.獲取和設(shè)置時(shí)間信息可用get和set方法,注意月份從0開始;3.手動(dòng)格式化日期需拼接字符串,也可使用第三方庫;4.處理時(shí)區(qū)問題建議使用支持時(shí)區(qū)的庫,如Luxon。掌握這些要點(diǎn)能有效避免常見錯(cuò)誤。

JavaScript與Java:開發(fā)人員的全面比較 JavaScript與Java:開發(fā)人員的全面比較 Jun 20, 2025 am 12:21 AM

JavaScriptIspreferredforredforwebdevelverment,而Javaisbetterforlarge-ScalebackendsystystemsandSandAndRoidApps.1)JavascriptexcelcelsincreatingInteractiveWebexperienceswebexperienceswithitswithitsdynamicnnamicnnamicnnamicnnamicnemicnemicnemicnemicnemicnemicnemicnemicnddommanipulation.2)

為什麼要將標(biāo)籤放在的底部? 為什麼要將標(biāo)籤放在的底部? Jul 02, 2025 am 01:22 AM

PlacingtagsatthebottomofablogpostorwebpageservespracticalpurposesforSEO,userexperience,anddesign.1.IthelpswithSEObyallowingsearchenginestoaccesskeyword-relevanttagswithoutclutteringthemaincontent.2.Itimprovesuserexperiencebykeepingthefocusonthearticl

JavaScript:探索用於高效編碼的數(shù)據(jù)類型 JavaScript:探索用於高效編碼的數(shù)據(jù)類型 Jun 20, 2025 am 12:46 AM

javascripthassevenfundaMentalDatatypes:數(shù)字,弦,布爾值,未定義,null,object和symbol.1)numberSeadUble-eaduble-ecisionFormat,forwidevaluerangesbutbecautious.2)

什麼是在DOM中冒泡和捕獲的事件? 什麼是在DOM中冒泡和捕獲的事件? Jul 02, 2025 am 01:19 AM

事件捕獲和冒泡是DOM中事件傳播的兩個(gè)階段,捕獲是從頂層向下到目標(biāo)元素,冒泡是從目標(biāo)元素向上傳播到頂層。 1.事件捕獲通過addEventListener的useCapture參數(shù)設(shè)為true實(shí)現(xiàn);2.事件冒泡是默認(rèn)行為,useCapture設(shè)為false或省略;3.可使用event.stopPropagation()阻止事件傳播;4.冒泡支持事件委託,提高動(dòng)態(tài)內(nèi)容處理效率;5.捕獲可用於提前攔截事件,如日誌記錄或錯(cuò)誤處理。了解這兩個(gè)階段有助於精確控制JavaScript響應(yīng)用戶操作的時(shí)機(jī)和方式。

Java和JavaScript有什麼區(qū)別? Java和JavaScript有什麼區(qū)別? Jun 17, 2025 am 09:17 AM

Java和JavaScript是不同的編程語言。 1.Java是靜態(tài)類型、編譯型語言,適用於企業(yè)應(yīng)用和大型系統(tǒng)。 2.JavaScript是動(dòng)態(tài)類型、解釋型語言,主要用於網(wǎng)頁交互和前端開發(fā)。

See all articles