実現したいこと
以下Issueについてです。
https://github.com/a10adotapp/react-waiter/issues/1
以下の内容について、Playwrightを使用したテストを書きたいです。
- Promiseが解決するまではプレースホルダ(
sideshow
)を表示すること - Promise解決後は指定した内容(
serve
)をレンダリングすること
背景
以下のReactのコンポーネントに対するテストをplaywrightで書いています。
複数のPromiseが解決するまでプレースホルダを表示し、全てのPromise解決後に指定した内容がレンダリングされるコンポーネントです。
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して使用すると問題なく動くので、テストの書き方が悪いのかと思います。
答えをお持ちの方や、何か思い当たる方がいらっしゃいましたらご教示いただけると幸いです。
よろしくお願い致します。
該当のソースコード
特になし
試したこと・調べたこと
- 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}

バッドをするには、ログインかつ
こちらの条件を満たす必要があります。