質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.31%
TypeScript

TypeScriptは、マイクロソフトによって開発された フリーでオープンソースのプログラミング言語です。 TypeScriptは、JavaScriptの構文の拡張であるので、既存の JavaScriptのコードにわずかな修正を加えれば動作します。

React.js

Reactは、アプリケーションのインターフェースを構築するためのオープンソースJavaScriptライブラリです。

Playwright

Playwrightは、Node.js、Python、Java、.NETでクロスブラウザのエンドツーエンドテストを自動化するためのライブラリです。 単一のAPIでChromium、Firefox、WebKitを操作できます。オートウェイト、自動スクロール、ネットワークインターセプトなどの機能を提供しています。

Q&A

1回答

113閲覧

playwrightのテストの書き方がわかりません。

a10adotapp

総合スコア0

TypeScript

TypeScriptは、マイクロソフトによって開発された フリーでオープンソースのプログラミング言語です。 TypeScriptは、JavaScriptの構文の拡張であるので、既存の JavaScriptのコードにわずかな修正を加えれば動作します。

React.js

Reactは、アプリケーションのインターフェースを構築するためのオープンソースJavaScriptライブラリです。

Playwright

Playwrightは、Node.js、Python、Java、.NETでクロスブラウザのエンドツーエンドテストを自動化するためのライブラリです。 単一のAPIでChromium、Firefox、WebKitを操作できます。オートウェイト、自動スクロール、ネットワークインターセプトなどの機能を提供しています。

0グッド

0クリップ

投稿2025/03/08 05:33

実現したいこと

以下Issueについてです。
https://github.com/a10adotapp/react-waiter/issues/1

以下の内容について、Playwrightを使用したテストを書きたいです。

  • Promiseが解決するまではプレースホルダ(sideshow)を表示すること
  • Promise解決後は指定した内容(serve)をレンダリングすること

背景

以下のReactのコンポーネントに対するテストをplaywrightで書いています。
複数のPromiseが解決するまでプレースホルダを表示し、全てのPromise解決後に指定した内容がレンダリングされるコンポーネントです。

https://github.com/a10adotapp/react-waiter/blob/1833831aef9e3b954f34c3fe1b2ddc273b78bff3/src/index.tsx

tsx

1 <Waiter 2 orders={{ 3 getUuidResult: getUuid(props.delay), 4 getUuidCachedResult: getUuidCached(props.delay), 5 }} 6 sideshow={<div>Loading...</div>} 7 serve={({ 8 getUuidResult, 9 getUuidCachedResult, 10 }) => ( 11 // レンダリングしたい内容 12 )} />

発生している問題・分からないこと

以下の内容でindex.spec.tsxを作成しました。

tsx

1import { expect, test } from "@playwright/experimental-ct-react"; 2import { Waiter } from "."; 3 4test("run as expected", async ({ mount }) => { 5 const delay = async (delay: number, error?: string | undefined) => { 6 return new Promise<number>((resolve, reject) => { 7 setTimeout(() => { 8 if (error) { 9 return reject(new Error(error)) 10 } 11 12 resolve(delay); 13 }, delay); 14 }); 15 }; 16 17 const component = await mount( 18 <Waiter 19 orders={{ 20 delay1000: delay(1000), 21 delay2000: delay(2000), 22 delayError: delay(3000, "resolve error"), 23 }} 24 sideshow={<div>Loading...</div>} 25 serve={({ 26 delay1000, 27 delay2000, 28 delayError, 29 }) => { 30 return ( 31 <ul> 32 <li id="delay-1000">{delay1000.value?.toFixed(0) || delay1000.error?.message || "delay1000"}</li> 33 <li id="delay-2000">{delay2000.value?.toFixed(0) || delay2000.error?.message || "delay2000"}</li> 34 <li id="delay-error">{delayError.value?.toFixed(0) || delayError.error?.message || "delayError"}</li> 35 </ul> 36 ); 37 }} 38 /> 39 ); 40 41 await expect(component).toContainText("Loading..."); 42 await expect(component).not.toContainText("delay1000"); 43 await expect(component).not.toContainText("delay2000"); 44 await expect(component).not.toContainText("resolve error"); 45 46 // TODO: add test for rendering after all orders are ready 47 // this is not implemented by not knowing how. 48});

上記ソースコメントの通りですが、Promiseが解決するまではプレースホルダ(sideshow)を表示することについてはテストできた一方、

Promise解決後は指定した内容(serve)をレンダリングすることについてテストを書くことができず困っております。

以下試してみましたが、コンポーネントの指定した内容を取得することはできませんでした。

tsx

1setTimeout(async () => { 2 await expect(component).toContainText("delay1000"); 3}, 5000);

tsx

1await page.waitForTimeout(5000);

以下のように、実際にNext.jsのアプリケーションにimportして使用すると問題なく動くので、テストの書き方が悪いのかと思います。

https://github.com/a10adotapp/react-waiter/blob/1833831aef9e3b954f34c3fe1b2ddc273b78bff3/examples/nextjs/README.md

答えをお持ちの方や、何か思い当たる方がいらっしゃいましたらご教示いただけると幸いです。
よろしくお願い致します。

該当のソースコード

特になし

試したこと・調べたこと

  • teratailやGoogle等で検索した
  • ソースコードを自分なりに変更した
  • 知人に聞いた
  • その他
上記の詳細・結果

質問文のとおりです。

補足

package.json

json

1{ 2 "devDependencies": { 3 "@chromatic-com/storybook": "^3.2.5", 4 "@eslint/js": "^9.21.0", 5 "@playwright/experimental-ct-react": "^1.51.0", 6 "@storybook/addon-essentials": "^8.6.3", 7 "@storybook/addon-onboarding": "^8.6.3", 8 "@storybook/addon-storysource": "^8.6.3", 9 "@storybook/blocks": "^8.6.3", 10 "@storybook/experimental-addon-test": "^8.6.3", 11 "@storybook/react": "^8.6.3", 12 "@storybook/react-vite": "^8.6.3", 13 "@storybook/test": "^8.6.3", 14 "@types/node": "^22.13.9", 15 "@types/react": "^19.0.10", 16 "@typescript-eslint/parser": "^8.26.0", 17 "@vitest/browser": "^3.0.7", 18 "@vitest/coverage-v8": "^3.0.7", 19 "eslint": "^9.21.0", 20 "eslint-plugin-react": "^7.37.4", 21 "playwright": "^1.50.1", 22 "storybook": "^8.6.3", 23 "typescript": "^5.8.2", 24 "typescript-eslint": "^8.26.0", 25 "vitest": "^3.0.7" 26 }, 27 "dependencies": { 28 "react": "^19.0.0" 29 } 30}

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

github拝見しました!
waiterは内部のChefで、Reactの "async component"(=asyncな関数でJSXを返す) を使っているようですが、playwrightは現在そのようなコンポーネントのテストをサポートしていない可能性があります

ソース:https://github.com/vercel/next.js/pull/69368/files#diff-17101b1f28b1328c50c485e0f95f7eda347ed8be4549f5413aa2cbe667f3a858R185

async function コンポーネントは基本的にサーバーコンポーネント用途(Next.js など)でのみ使われるため、playwrightがうまくマウントできていないと考えられます
Chef をuseEffect ベースの実装に変えるとCSR的に動いてテスト可能になるかもしれませんが、別のテスト方法を考えるのも一つの手段かもしれません

投稿2025/03/24 05:25

kmr_kiko

総合スコア49

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.31%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問