タイトルからすると、これは可能でしょうか?
ヘッダーとユーザーを次のページにリダイレクトするボタンを含む、Vue アプリケーションの単純なコンポーネントをテストしようとしています。ボタンをクリックしたときにイベント/メッセージがルーターに送信されるかどうかをテストし、宛先ルートが正しいかどうかを確認したいと考えています。
アプリケーションは次のように構成されています:
App.Vue - エントリ コンポーネント
リーリーrouter/index.ts - Vue ルーター設定ファイル
リーリーHomeView.Vue - アプリコンポーネントの RouterView の入口ビュー
リーリーButtonRouterLink.vue
リーリーCompositionAPI と TypeScript を使用していることを考慮すると、Vitest テストでルーターをモックする方法はありますか?
これはテスト ファイル構造の例です (HomeView.spec.ts):
リーリー複数のメソッドを試しました: vi.mock('vue-router')、vi.spyOn(useRoute,'push')、vue-router-mock ライブラリですが、テストを実行できないようです。ルーターが使用できないことを示します。
@tao の提案に基づいて、HomeView でクリック イベントをテストするのは良いテストではないことに気づきました (アプリではなくライブラリをテストする)。そのため、テスト ButtonRouterLink を追加して、 to パラメータを使用して、RouterLink を正しく Vue します:
リーリー空の HTML 文字列をレンダリングします""
あまり役に立たない Vue 警告が表示されます (予期されるタイプが指定されていません):
ああああ
これは可能です。
あなたの例と公式の例の間には重要な違いがあります。テスト対象のコンポーネントでは、RouterLink
これにより単体テストはどう変わるでしょうか?
を使用する (または
router.push## を使用する) のではなく、中間コンポーネントに配置しています。 # ボタン)。最初の問題は、子コンポーネントを空のコンテナに置き換える
shallowMount
この問題を解決するためのオプションは次のとおりです:
を使用していることです。あなたの場合、これは、
ButtonRouterLink にRouterLink
が含まれなくなり、クリック イベントを処理せず、クリック イベントを受信するだけであることを意味します。shallowMount- の代わりに
b) この関数のテストを ButtonRouterLink- のテストに移動します。
この機能を独自のコンポーネントに移動することによって生じる 2 番目の問題は、もう少し微妙です。一般に、ButtonRouterLink の次のテストが機能することが期待されます:mount
を使用し、これを単体テストではなく統合テストに変更しますButtonRouterLink
の任意の:to
が{ name: to }
に正しく変換され、RouterLink
に渡されることをテストしたら、これらの:to
が、それらを使用するコンポーネントの<ButtonRouterLink />
に正しく渡されるかどうかをテストする必要があります。リーリー
驚いたことに、このテストは失敗し、RouterLinkStub で受信した
:to属性の値が
<RouterLink />{ name: RouterNames.GAME }
ではなくであると主張しています。 'game'
、これはButtonRouterLink
に渡す値です。これは、コンポーネントがvalue
を{ name: value }
に変換しなかったようなものです。###かなり奇妙。
問題は、がコンポーネントのルート要素であることが判明しました。これは、DOM 内のコンポーネント (
コンポーネント (<BottomRouterLink>
) が
<RouterLinkStub>に置き換えられますが、
:toの値は以前のものであることを意味します。そして後者は読まれませんでした。つまり、テンプレートが次のようであればテストは成功します:
リーリーこの問題を解決するには、実際の
RouterLinkvue-router
少し注意が必要です。から) をインポートし、
it
を見つける必要があります。 RouterLinkStub を見つける代わりに。なぜ? @vue/test-utilsは実際のコンポーネントではなくスタブ コンポーネントを見つけるのに十分賢いですが、この方法では
.findComponent()は置換された要素のみに一致し、要素には一致しません。
ButtonRouterLink(未処理) の場合はまだ残っています。この時点で、
:toの値は、
RouterLinkが実際に受信した値に解析されています。
完全なテストは次のとおりです:
リーリー