Simulation Vue-Router utilisant Vue-Test-Utils et Vitest
P粉190883225
P粉190883225 2023-08-25 09:26:52
0
1
610
<p>J'essaie de comprendre la logique de se moquer de Vue-Router avec Vitest. </p> <p>Pour ce faire, j'ai essayé de configurer et de simuler mon environnement de test sur un projet très simple. Lorsque j'essaie de suivre la documentation officielle de Vue-Test-Utils, j'obtiens toujours une erreur. Je ne sais pas si c'est parce qu'ils utilisent Jest. </p> <p>L'utilisation d'un vrai vue-router a résolu mon problème, mais je pense que se moquer de vue-router est mieux. </p> <p> Ci-dessous, je vais d'abord transmettre le code source du projet, puis les erreurs que j'ai reçues. </p> <h3>Accueil.vue</h3> <pre class="brush:php;toolbar:false;"><configuration du script lang="ts"> importer {onMounted} depuis "vue" ; importer {useRoute} depuis "vue-router" ; const route = useRoute() onMounted(() => { console.log(route.query) }) </script> <modèle> <div>Accueil</div> </template></pre> <h3>首页.spec.ts</h3> <pre class="brush:php;toolbar:false;">import {expect, it, vi} depuis "vitest" ; importer {mount} depuis "@vue/test-utils" ; importer Home depuis "../src/components/Home.vue" it('Home Test', async() => { const wrapper = mount (Accueil) attendre(wrapper.exists()).toBeTruthy() })</pré> <h3>vite.config.ts</h3> <pre class="brush:php;toolbar:false;">/// <reference types="vitest" /> importer {defineConfig} depuis 'vite' importer la vue depuis '@vitejs/plugin-vue' // https://vitejs.dev/config/ exporter la définition par défaut ({ plugins : [vue()], test: { environnement : 'jsdom', inclure : ['./test/**/*.spec.ts'], exclure : ['node_modules', 'dist'], globales : vrai } })</pré> <h3>我的错误消息如下:..</h3> <h3>我尝试过的方法</h3> <p>我尝试像下面这样模拟 vue-router</p> <pre class="brush:php;toolbar:false;">vi.mock('vue-router', () => ({ useRoute : vi.fn(), }))</pré> <p>或者只是</p> <pre class="brush:php;toolbar:false;">vi.mock('vue-router')</pre> <h4>这是我的最终 Home.spec.ts 文件</h4> <pre class="brush:php;toolbar:false;">import {expect, it, vi} depuis "vitest" ; importer {mount} depuis "@vue/test-utils" ; importer Home depuis "../src/components/Home.vue" vi.mock('vue-router') it('Home Test', async() => { const wrapper = mount(Accueil, { mondial: { stubs : ["router-link", "router-view"] } }) attendre(wrapper.exists()).toBeTruthy() })</pre></p>
P粉190883225
P粉190883225

répondre à tous(1)
P粉294954447

Tout d'abord, j'espère qu'en Home.vue 中看到 router-linkrouter-view :

<script setup lang="ts">
import { onMounted } from 'vue';
import { useRoute } from 'vue-router';

const route = useRoute();

onMounted(() => {
  console.log(route.query);
});
</script>

<template>
  <router-link to="home">Go to home</router-link>
  <router-view />
</template>

Par conséquent, Home.spec.ts devrait ressembler à ceci :

import { expect, it, vi } from 'vitest';
import { mount } from '@vue/test-utils';
import * as VueRouter from 'vue-router';
import Home from '../src/components/Home.vue';

describe('./path/to/Home.vue', () => {
  const useRouteSpy = vi.spyOn(VueRouter, 'useRoute');
  const getWrapper = () => mount(Home as any, {
    global: {
      stubs: {
        'router-link': { template: '<div/>' },
        'router-view': { template: '<div/>' },
      },
    },
  });

  it('the component should be mounted', () => {
    // ARRANGE
    const useRouteMock = useRouteSpy.mockImplementationOnce({ query: 'query' });
    // ACT
    const wrapper = getWrapper();
    // ASSERT
    expect(useRouteMock).toHaveBeenCalled();
    expect(wrapper.exists()).toBeTruthy();
  });
});

Quelques commentaires/suggestions :

  • Utilisez des descriptions pour définir le contexte du test
  • Définir une fonction globale pour monter des composants, réutiliser au lieu de dupliquer
  • Utilisez .spyOn().mockImplementation...() pour la surveillance et la simulation
  • Utilisez une manière structurée/directe d'écrire des tests, tels que AAA [organiser, agir, affirmer] ou GWT [donné, quand, alors]. Je le teste depuis quelques années et je l'utilise toujours, cela m'aide à comprendre ce que je teste
  • Utilisez .toHaveBeenCalled...() pour vérifier si la simulation fonctionne comme prévu
  • mount() 函数中的存根应与模板中使用的组件相关(因此,如果您不使用 , il ne doit pas être répertorié comme talon)

J'espère que cela vous aidera, acclamations!

Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal