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

ホームページ ウェブフロントエンド jsチュートリアル ReactJS コンテキストのテスト - テストダブルのガイド

ReactJS コンテキストのテスト - テストダブルのガイド

Dec 05, 2024 am 02:03 AM

この投稿では、テスト ライブラリを使用して、コンテキストに依存する React コンポーネントをテストするための思考プロセスを説明します。私の目的は、これらのコンポーネントをテストするための別のアプローチを検討し、モックを使用する場(chǎng)合とコンテキストをモックせずにテストする場(chǎng)合の長(zhǎng)所と短所を検討することです。それぞれのアプローチがテストの信頼性にどのような影響を與えるかを見ていき、実際のアプリケーションにおいて、ある方法が他の方法よりも有益である場(chǎng)合とその理由についての洞察を共有します。

知っておくべきこと

  • reactjs の使用目的 (おそらく、すでにいくつかのアプリを作成したことがあるでしょう)
  • ヴィテストとは

反応コンテキストとは何ですか

ReactJS コンテキストは、ReactJS コンポーネントの構(gòu)造における一般的な問題、つまりプロップドリルの解決策として登場(chǎng)しました。プロップドリルは、同じデータセットにアクセスする必要がある一連のコンポーネントがある場(chǎng)合に発生します。コンテキスト メカニズムにより、コンテキスト自體が最初の子孫である限り、コンポーネントは同じデータ セットを共有できます。

reactjs ドキュメントでは、テーマを保持するためのコンテキストが使用されます。他のコンポーネントがこの情報(bào)を必要とする可能性があるため、ドキュメントでは props 経由で値を渡すのではなく、コンテキストを使用してその情報(bào)を処理します。もう 1 つの例は、アプリケーションのレイアウトを保持するためのコンテキストの使用です。json-tool の例では、App.tsx は、すべてのアプリケーションで使用できる DefaultLayout コンテキストでアプリケーションをラップします。

この例のアプリ

次の例では、テーマ アプリが使用されます。これは、ユーザーが明るいテーマと暗いテーマを切り替えることができるアプリケーションです。このアプリは、reactjs 公式ドキュメントでも使用されています。このアプリケーションは、ライト テーマ モードとダーク テーマ モードを切り替えるシンプルなトグルで構(gòu)成されています。アプリケーションは非常にシンプルで、すべてを 1 つのファイルにプロットできます:

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

このアプリケーションには、アプリとページという 2 つの主要コンポーネントがあります。 App コンポーネントはメイン コンポーネントとして機(jī)能し、現(xiàn)在のテーマの狀態(tài) (「明るい」または「暗い」のいずれか) が含まれます。また、テーマをライト モードとダーク モードの間で切り替えるボタンも含まれています。 Page コンポーネントは App の子であり、テーマ コンテキストを使用して現(xiàn)在のテーマを表示します。 App コンポーネントのボタンは単純なトグル ボタンで、クリックするとテーマが切り替わり、それに応じてコンテキスト値が更新されます。

Testing ReactJS Context - A Guide with test-doubles

次のセクションでは、テスト用のコンポーネントのスライスについて説明します。

テスト用に點(diǎn)火する

通常、どのようなアプリケーションでも、どのような種類のテストを?qū)g行したいのか、どのスライスに取り組みたいのかに焦點(diǎn)を當(dāng)てる必要があります。たとえば、アプリケーション全體ではなく、単一のコンポーネントをターゲットにすることができます。この例では、Page コンポーネントから始めます。これをテストするには、test-double を使用する必要があります。

Testing ReactJS Context - A Guide with test-doubles

テストダブルはコンテキストに依存するため、アプリ構(gòu)造自體から取得され、それを変更するにはコンテキスト內(nèi)の値も変更する必要があります。

テストダブルス

reactjs のコンテキストを使用したテスト アプローチを開始するには、最初のテストの作成を開始します。

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

ライト テーマが ThemeContext でデフォルトのテーマに設(shè)定されている場(chǎng)合、このテストは期待どおりに合格します。この最初の例も同様にテストすることもできますが、ダーク テーマに興味がある 2 番目のテストで物事が面白くなります。ダークテーマに入るには、reactjs コンテキストに依存していることを考慮して、テストダブルの使用を開始する必要があります。 2 番目のテストでは、vi.mocked だけでなく vi.mock もミックスに加えます。 2 番目に作成するテストでは、最初のテストも変更する必要があることに注意してください。

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()
  })
})

両方のテスト ケースは、アプリケーションをテストするために偽物を使用しています。コンテキストから返されるデータを変更すると、テストも変更されます。ここでの注意點(diǎn)は次のとおりです。

  • 私たちは、「自分が所有していないものを嘲笑するな」原則を強(qiáng)制するreactjsコンテキストを嘲笑しています
  • モックを使用する必要があるため、テストはより冗長(zhǎng)になります
  • 私たちが作成した 2 つのテストは、アプリケーションとのユーザーの対話を反映していません。トグルボタンを押すとテーマが変わることがわかっています。

このセクションで使用されている完成したコードは GitHub で入手できます

テストダブルなし

次のアプローチは、アプリケーションに埋め込まれたコンテキストを、分離したりテストダブルを使用したりせずに使用することです。 TDD でこのアプローチを採(cǎi)用すると、ユーザーがどのように動(dòng)作するかをシミュレートする非常に単純なテストから始めることができます。

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()
  })
})

次に 2 番目のテストに続いて、デフォルトでライト テーマを設(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()
  })
})

この戦略の注意點(diǎn):

  • テストダブルは必要ありません。テストのコードが少なくなります
  • テストの動(dòng)作は、ユーザーが実際のアプリケーションで行うことと一致します

このセクションで使用されている完成したコードは GitHub で入手できます

それぞれのアプローチの長(zhǎng)所と短所

このセクションでは、さまざまなプロパティに関する各アプローチの長(zhǎng)所と短所を説明します。

小道具へのリファクタリング

コンテキストにテストダブルを使用すると、この種の変更に対してテストが脆弱になります。 props を使用して useContext の使用をリファクタリングすると、動(dòng)作が失敗しない場(chǎng)合でもテストが自動(dòng)的に失敗します。テストダブルを使用しないオプションを使用すると、その意味でのリファクタリングがサポートされます。

カスタムコンテキストの作成

reactjs からのコンテキスト プロバイダーに直接依存するのではなく、カスタム コンテキストを使用しても同じことが起こります。テストダブルを使用せずにオプションを使用すると、リファクタリングが有効になります。

結(jié)論

このガイドでは、テストダブルを必要とせずにコンテキストに依存するコンポーネントをテストする方法を検討し、テストをより単純にして実際のユーザーの操作に近づけ、各アプローチの長(zhǎng)所と短所を?qū)澅趣丹护蓼筏?。可能な限り、ユーザー インタラクションを反映した単純なアプローチに従う必要があります。ただし、テストダブルが必要な場(chǎng)合は、テストコードの保守性を考慮して使用する必要があります。簡(jiǎn)単なテストを行うことで、本番コードで自信を持ってリファクタリングできるようになります。

リソース

  • カスタムコンテキストの作成
  • リファクタリング カタログ
  • vitest を使用してモジュールの特定の部分をモックする方法を見つけるために使用されました
  • 型の問題を修正する方法を見つけるために使用されました
  • ライブラリ userEvent のテスト

次のステップ

  • 複數(shù)のコンテキストまたはネストされたプロバイダーを含む、より複雑なシナリオをテストしてみてください。
  • このガイドではモックを避けていますが、モックが必要な場(chǎng)合もあります。これらのシナリオ向けの高度なモック手法を検討してください。

これらの手順に従うことで、テスト スキルを継続的に向上させ、React アプリケーションがリファクタリングに対応できるようにすることができます。

以上がReactJS コンテキストのテスト - テストダブルのガイドの詳細(xì)內(nèi)容です。詳細(xì)については、PHP 中國(guó)語(yǔ) Web サイトの他の関連記事を參照してください。

このウェブサイトの聲明
この記事の內(nèi)容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰屬します。このサイトは、それに相當(dāng)する法的責(zé)任を負(fù)いません。盜作または侵害の疑いのあるコンテンツを見つけた場(chǎng)合は、admin@php.cn までご連絡(luò)ください。

ホットAIツール

Undress AI Tool

Undress AI Tool

脫衣畫像を無(wú)料で

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード寫真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

寫真から衣服を削除するオンライン AI ツール。

Clothoff.io

Clothoff.io

AI衣類リムーバー

Video Face Swap

Video Face Swap

完全無(wú)料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡(jiǎn)単に交換できます。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無(wú)料のコードエディター

SublimeText3 中國(guó)語(yǔ)版

SublimeText3 中國(guó)語(yǔ)版

中國(guó)語(yǔ)版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強(qiáng)力な PHP 統(tǒng)合開発環(huán)境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

Java vs. JavaScript:混亂を解消します Java vs. JavaScript:混亂を解消します Jun 20, 2025 am 12:27 AM

JavaとJavaScriptは異なるプログラミング言語(yǔ)であり、それぞれ異なるアプリケーションシナリオに適しています。 Javaは大規(guī)模なエンタープライズおよびモバイルアプリケーション開発に使用されますが、JavaScriptは主にWebページ開発に使用されます。

JavaScriptコメント:短い説明 JavaScriptコメント:短い説明 Jun 19, 2025 am 12:40 AM

JavaScriptcommentsEareEssentialential-formaining、およびGuidingCodeexecution.1)single-linecommentseared forquickexplanations.2)多LinecommentsexplaincomplexlogiCorprovidededocumentation.3)clarifyspartsofcode.bestpractic

JSで日付と時(shí)間を操作する方法は? JSで日付と時(shí)間を操作する方法は? Jul 01, 2025 am 01:27 AM

JavaScriptで日付と時(shí)間を処理する場(chǎng)合は、次の點(diǎn)に注意する必要があります。1。日付オブジェクトを作成するには多くの方法があります。 ISO形式の文字列を使用して、互換性を確保することをお?jiǎng)幛幛筏蓼埂?2。時(shí)間情報(bào)を取得および設(shè)定して、メソッドを設(shè)定でき、月は0から始まることに注意してください。 3.手動(dòng)でのフォーマット日付には文字列が必要であり、サードパーティライブラリも使用できます。 4.ルクソンなどのタイムゾーンをサポートするライブラリを使用することをお?jiǎng)幛幛筏蓼?。これらの重要なポイントを?xí)得すると、一般的な間違いを効果的に回避できます。

なぜの下部にタグを配置する必要があるのですか? なぜの下部にタグを配置する必要があるのですか? Jul 02, 2025 am 01:22 AM

PLACSTHETTHETTHE BOTTOMOFABLOGPOSTORWEBPAGESERVESPAGESPORCICALPURPOSESESFORSEO、userexperience、andDesign.1.IthelpswithiobyAllowingseNStoAccessKeysword-relevanttagwithtagwithtagwithtagwithemaincontent.2.iTimrovesexperiencebyepingepintepepinedeeping

JavaScript vs. Java:開発者向けの包括的な比較 JavaScript vs. Java:開発者向けの包括的な比較 Jun 20, 2025 am 12:21 AM

javascriptispreferredforwebdevelopment、whilejavaisbetterforlge-scalebackendsystemsandroidapps.1)javascriptexcelsininintingtivewebexperiences withitsdynAmicnature anddommanipulation.2)javaofferstruntypyping-dobject-reientedpeatures

JavaScript:効率的なコーディングのためのデータ型の調(diào)査 JavaScript:効率的なコーディングのためのデータ型の調(diào)査 Jun 20, 2025 am 12:46 AM

javascripthassevenfundamentaldatypes:number、string、boolean、undefined、null、object、andsymbol.1)numberseadouble-precisionformat、有用であるため、有用性の高いものであるため、but-for-loating-pointarithmetic.2)ストリングリムムット、使用率が有用であること

DOMでのイベントの泡立ちとキャプチャとは何ですか? DOMでのイベントの泡立ちとキャプチャとは何ですか? Jul 02, 2025 am 01:19 AM

イベントキャプチャとバブルは、DOMのイベント伝播の2つの段階です。キャプチャは最上層からターゲット要素までであり、バブルはターゲット要素から上層までです。 1.イベントキャプチャは、AddEventListenerのUseCaptureパラメーターをTrueに設(shè)定することにより実裝されます。 2。イベントバブルはデフォルトの動(dòng)作であり、UseCaptureはfalseに設(shè)定されているか、省略されます。 3。イベントの伝播を使用して、イベントの伝播を防ぐことができます。 4.イベントバブルは、動(dòng)的なコンテンツ処理効率を改善するためにイベント委任をサポートします。 5.キャプチャを使用して、ロギングやエラー処理など、事前にイベントを傍受できます。これらの2つのフェーズを理解することは、タイミングとJavaScriptがユーザー操作にどのように反応するかを正確に制御するのに役立ちます。

JavaとJavaScriptの違いは何ですか? JavaとJavaScriptの違いは何ですか? Jun 17, 2025 am 09:17 AM

JavaとJavaScriptは、異なるプログラミング言語(yǔ)です。 1.Javaは、エンタープライズアプリケーションや大規(guī)模なシステムに適した、靜的に型付けされ、コンパイルされた言語(yǔ)です。 2。JavaScriptは動(dòng)的なタイプと解釈された言語(yǔ)であり、主にWebインタラクションとフロントエンド開発に使用されます。

See all articles