@@ -8,21 +8,29 @@ import IndexPage from '~/pages/index.vue';
88// undefined になり、日本語でもタイトルが "KamiMap" になっていた。
99// 例外は出ず画面も崩れないので、実際に描画したタイトルで固定する。
1010
11- const titleFor = async ( locale : string ) => {
11+ const titleFor = async ( locale : string , expected : string ) => {
1212 const { $i18n } = useNuxtApp ( ) as any ;
13- $i18n . locale . value = locale ;
14- await mountSuspended ( IndexPage ) ;
15- // useHead はクライアントでは document に反映されるので、実際のタイトルを見る
16- await new Promise ( ( r ) => setTimeout ( r , 0 ) ) ;
17- return document . title ;
13+ // lazy: true なので locale.value を直接書き換えても翻訳は読み込まれない。
14+ // setLocale を使って読み込みまで待つ
15+ await $i18n . setLocale ( locale ) ;
16+ const wrapper = await mountSuspended ( IndexPage ) ;
17+ // useHead が document に反映されるのは非同期なので、期待値になるまで待つ。
18+ // 壊れているときは変わらないままタイムアウトして、その値で落ちる
19+ for ( let i = 0 ; i < 40 && document . title !== expected ; i ++ ) {
20+ await new Promise ( ( r ) => setTimeout ( r , 25 ) ) ;
21+ }
22+ const title = document . title ;
23+ // 前のマウントが残るとその useHead が document.title を握り続けるため必ず破棄する
24+ wrapper . unmount ( ) ;
25+ await new Promise ( ( r ) => setTimeout ( r , 25 ) ) ;
26+ return title ;
1827} ;
1928
29+ // 分岐そのものは test-unit/lib/siteMeta.spec.ts で見ている。
30+ // ここは useHead が実際に locale を見られているか(head() のままなら見られない)だけを見る。
31+ // 同じ app に2回マウントすると前の useHead が document.title を握るため、1件に絞る。
2032describe ( 'トップページのタイトル' , ( ) => {
21- test ( 'ja では翻訳された名前を使う' , async ( ) => {
22- expect ( await titleFor ( 'ja' ) ) . toBe ( '紙マップ' ) ;
23- } ) ;
24-
25- test ( '翻訳のないロケールでは英語の固定名にフォールバックする' , async ( ) => {
26- expect ( await titleFor ( 'zh' ) ) . toBe ( 'KamiMap' ) ;
33+ test ( 'ja では翻訳された名前が実際に描画される' , async ( ) => {
34+ expect ( await titleFor ( 'ja' , '紙マップ' ) ) . toBe ( '紙マップ' ) ;
2735 } ) ;
2836} ) ;
0 commit comments