Playwright のようなエンドツーエンドのテスト フレームワークを使用する場合、GraphQL リクエストをモックすると、テストの信頼性と速度が大幅に向上します。 Jay Freestone の優れたブログ投稿「Playwright での GraphQL リクエストのスタブ化」に触発されて、柔軟な GraphQL リクエストのインターセプトとレスポンスのスタブ化を可能にする再利用可能なユーティリティ関数を構築することにしました。
この投稿では、interceptGQL ユーティリティの実装を説明し、Playwright でそれを使用して GraphQL クエリとミューテーションのサーバー応答を模擬する方法を示します。
interceptGQL ユーティリティ: 仕組み
interceptGQL ユーティリティは、バックエンドへのすべての GraphQL リクエストのルート ハンドラーを登録し、operationName に基づいて特定の操作をインターセプトします。各オペレーションがどのように応答するかを定義し、リクエストで渡された変数を検証できます。
実装は次のとおりです:
import { test as baseTest, Page, Route } from '@playwright/test'; import { namedOperations } from '../../src/graphql/autogenerate/operations'; type CalledWith = Record<string unknown>; type Operations = keyof (typeof namedOperations)['Query'] | keyof (typeof namedOperations)['Mutation']; type InterceptConfig = { operationName: Operations | string; res: Record<string unknown>; }; type InterceptedPayloads = { [operationName: string]: CalledWith[]; }; export async function interceptGQL( page: Page, interceptConfigs: InterceptConfig[] ): Promise { const reqs: InterceptedPayloads = {}; interceptConfigs.forEach(config => { reqs[config.operationName] = []; }); await page.route('**/graphql', (route: Route) => { const req = route.request().postDataJSON(); const operationConfig = interceptConfigs.find(config => config.operationName === req.operationName); if (!operationConfig) { return route.continue(); } reqs[req.operationName].push(req.variables); return route.fulfill({ status: 200, contentType: 'application/json', body: JSON.stringify({ data: operationConfig.res }), }); }); return { reqs }; } export const test = baseTest.extend({ interceptGQL: async ({ browser }, use) => { await use(interceptGQL); }, }); </string></string>
例: タスク管理ダッシュボードのテスト
ユーティリティの実際の動作を示すために、それを使用してタスク管理ダッシュボードをテストしてみましょう。 GraphQL クエリ (GetTasks) をインターセプトし、その応答をモックします。
import { expect } from '@playwright/test'; import { namedOperations } from '../../../src/graphql/autogenerate/operations'; import { test } from '../../fixtures'; import { GetTasksMock } from './mocks/GetTasks.mock'; test.describe('Task Management Dashboard', () => { test.beforeEach(async ({ page, interceptGQL }) => { await page.goto('/tasks'); await interceptGQL(page, [ { operationName: namedOperations.Query['GetTasks'], res: GetTasksMock, }, ]); }); test('Should render a list of tasks', async ({ page }) => { const taskDashboardTitle = page.getByTestId('task-dashboard-title'); await expect(taskDashboardTitle).toHaveText('Task Dashboard'); const firstTaskTitle = page.getByTestId('0-task-title'); await expect(firstTaskTitle).toHaveText('Implement authentication flow'); const firstTaskStatus = page.getByTestId('0-task-status'); await expect(firstTaskStatus).toHaveText('In Progress'); }); test('Should navigate to task details page when a task is clicked', async ({ page }) => { await page.getByTestId('0-task-title').click(); await expect(page.getByTestId('task-details-header')).toHaveText('Task Details'); await expect(page.getByTestId('task-details-title')).toHaveText('Implement authentication flow'); }); });
ここで何が起こっているのですか?
- リクエストのインターセプト: interceptGQL ユーティリティは GetTasks クエリをインターセプトし、GetTasksMock で定義されたモック データを返します。
- 応答のモック: モックされた応答は、実際のバックエンドにアクセスする代わりに提供されます。
- 変数の検証: このユーティリティは、リクエストとともに送信された GraphQL 変数も保存します。これは、API 呼び出しを個別にテストするのに役立ちます。
このアプローチを使用する理由
- 速度の向上: 実際のネットワーク リクエストを回避することで、テストがより高速かつ確実に実行されます。
- 簡略化されたテスト データ: 応答を制御することで、エッジ ケースやさまざまなアプリケーション状態のテストが容易になります。
- API 呼び出しの検証: リクエストとともに送信された変数をキャプチャすることで、フロントエンドが正しいパラメーターを使用してバックエンドを呼び出すことを確認できます。
この実装とアプローチは、Jay Freestone の優れたブログ投稿「Playwright での GraphQL リクエストのスタブ化」からインスピレーションを得ています。彼の投稿は、interceptGQL ユーティリティを構築するための強固な基盤を提供しました。
このユーティリティを Playwright テスト スイートに組み込むことで、GraphQL クエリとミューテーションを簡単にモックでき、複雑なシナリオを簡素化しながらテストの速度と信頼性を向上させることができます。
以上がPlaywright: 効率的なテストのためのユーティリティでの GraphQL リクエストの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

JavaScript文字列置換法とFAQの詳細な説明 この記事では、javaScriptの文字列文字を置き換える2つの方法について説明します:内部JavaScriptコードとWebページの内部HTML。 JavaScriptコード内の文字列を交換します 最も直接的な方法は、置換()メソッドを使用することです。 str = str.replace( "find"、 "置換"); この方法は、最初の一致のみを置き換えます。すべての一致を置き換えるには、正規表現を使用して、グローバルフラグGを追加します。 str = str.replace(/fi

このチュートリアルでは、カスタムGoogle検索APIをブログまたはWebサイトに統合する方法を示し、標準のWordPressテーマ検索関数よりも洗練された検索エクスペリエンスを提供します。 驚くほど簡単です!検索をyに制限することができます

それで、あなたはここで、Ajaxと呼ばれるこのことについてすべてを学ぶ準備ができています。しかし、それは正確には何ですか? Ajaxという用語は、動的でインタラクティブなWebコンテンツを作成するために使用されるテクノロジーのゆるいグループ化を指します。 Ajaxという用語は、もともとJesse Jによって造られました

この記事シリーズは、2017年半ばに最新の情報と新鮮な例で書き直されました。 このJSONの例では、JSON形式を使用してファイルに単純な値を保存する方法について説明します。 キー価値ペア表記を使用して、あらゆる種類を保存できます

楽なWebページレイアウトのためにjQueryを活用する:8本質的なプラグイン jQueryは、Webページのレイアウトを大幅に簡素化します。 この記事では、プロセスを合理化する8つの強力なjQueryプラグイン、特に手動のウェブサイトの作成に役立ちます

コアポイント これは通常、メソッドを「所有」するオブジェクトを指しますが、関数がどのように呼び出されるかに依存します。 現在のオブジェクトがない場合、これはグローバルオブジェクトを指します。 Webブラウザでは、ウィンドウで表されます。 関数を呼び出すと、これはグローバルオブジェクトを維持しますが、オブジェクトコンストラクターまたはそのメソッドを呼び出すとき、これはオブジェクトのインスタンスを指します。 call()、apply()、bind()などのメソッドを使用して、このコンテキストを変更できます。これらのメソッドは、与えられたこの値とパラメーターを使用して関数を呼び出します。 JavaScriptは優れたプログラミング言語です。数年前、この文はそうでした

jQueryは素晴らしいJavaScriptフレームワークです。ただし、他のライブラリと同様に、何が起こっているのかを発見するためにフードの下に入る必要がある場合があります。おそらく、バグをトレースしているか、jQueryが特定のUIをどのように達成するかに興味があるからです

この投稿は、Android、BlackBerry、およびiPhoneアプリ開発用の有用なチートシート、リファレンスガイド、クイックレシピ、コードスニペットをコンパイルします。 開発者がいないべきではありません! タッチジェスチャーリファレンスガイド(PDF) Desigの貴重なリソース


ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

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

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

AI Hentai Generator
AIヘンタイを無料で生成します。

人気の記事

ホットツール

mPDF
mPDF は、UTF-8 でエンコードされた HTML から PDF ファイルを生成できる PHP ライブラリです。オリジナルの作者である Ian Back は、Web サイトから「オンザフライ」で PDF ファイルを出力し、さまざまな言語を処理するために mPDF を作成しました。 HTML2FPDF などのオリジナルのスクリプトよりも遅く、Unicode フォントを使用すると生成されるファイルが大きくなりますが、CSS スタイルなどをサポートし、多くの機能強化が施されています。 RTL (アラビア語とヘブライ語) や CJK (中国語、日本語、韓国語) を含むほぼすべての言語をサポートします。ネストされたブロックレベル要素 (P、DIV など) をサポートします。

SublimeText3 Linux 新バージョン
SublimeText3 Linux 最新バージョン

メモ帳++7.3.1
使いやすく無料のコードエディター

PhpStorm Mac バージョン
最新(2018.2.1)のプロフェッショナル向けPHP統合開発ツール

ドリームウィーバー CS6
ビジュアル Web 開発ツール
