国产av日韩一区二区三区精品,成人性爱视频在线观看,国产,欧美,日韩,一区,www.成色av久久成人,2222eeee成人天堂

使用 Vue-Test-Utils 和 Vitest 進(jìn)行 Vue-Router 模擬
P粉190883225
P粉190883225 2023-08-25 09:26:52
0
1
842
<p>我試圖理解用 Vitest 模擬 Vue-Router 的邏輯。</p> <p>為此,我嘗試在一個非常簡單的項(xiàng)目上設(shè)置并模擬我的測試環(huán)境。當(dāng)我嘗試按照Vue-Test-Utils的官方文檔進(jìn)行操作時,總是出現(xiàn)錯誤。我不知道是不是因?yàn)樗麄兪褂?Jest。</p> <p>使用真正的 vue-router 解決了我的問題,但我認(rèn)為模擬 vue-router 更好。</p> <p>下面我先傳達(dá)一下項(xiàng)目的源碼,然后是我收到的錯誤。</p> <h3>首頁.vue</h3> <pre class="brush:php;toolbar:false;"><script setup lang="ts"> import {onMounted} from "vue"; import {useRoute} from "vue-router"; const route = useRoute() onMounted(() => { console.log(route.query) }) </script> <template> <div>Home</div> </template></pre> <h3>首頁.spec.ts</h3> <pre class="brush:php;toolbar:false;">import {expect, it, vi} from "vitest"; import {mount} from "@vue/test-utils"; import Home from "../src/components/Home.vue" it('Home Test', async () => { const wrapper = mount(Home) expect(wrapper.exists()).toBeTruthy() })</pre> <h3>vite.config.ts</h3> <pre class="brush:php;toolbar:false;">/// <reference types="vitest" /> import { defineConfig } from 'vite' import vue from '@vitejs/plugin-vue' // https://vitejs.dev/config/ export default defineConfig({ plugins: [vue()], test: { environment: 'jsdom', include: ['./test/**/*.spec.ts'], exclude: ['node_modules', 'dist'], globals: true } })</pre> <h3>我的錯誤消息如下:..</h3> <h3>我嘗試過的方法</h3> <p>我嘗試像下面這樣模擬 vue-router</p> <pre class="brush:php;toolbar:false;">vi.mock('vue-router', () => ({ useRoute: vi.fn(), }))</pre> <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} from "vitest"; import {mount} from "@vue/test-utils"; import Home from "../src/components/Home.vue" vi.mock('vue-router') it('Home Test', async () => { const wrapper = mount(Home, { global: { stubs: ["router-link", "router-view"] } }) expect(wrapper.exists()).toBeTruthy() })</pre></p>
P粉190883225
P粉190883225

全部回復(fù)(1)
P粉294954447

首先,我希望在 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>

因此,Home.spec.ts 應(yīng)該是這樣的:

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();
  });
});

一些評論/建議:

  • 使用描述來界定測試上下文
  • 定義一個全局函數(shù)來掛載組件,重用而不是重復(fù)
  • 使用 .spyOn().mockImplementation...() 進(jìn)行監(jiān)視和模擬
  • 使用某種結(jié)構(gòu)化/直接的方式來編寫測試,例如 AAA [安排、行動、斷言] 或 GWT [給定、何時、然后]。我已經(jīng)測試了幾年并且仍在使用它,它可以幫助我了解我正在測試的內(nèi)容
  • 使用 .toHaveBeenCalled...() 檢查模擬是否按預(yù)期工作
  • mount() 函數(shù)中的存根應(yīng)與模板中使用的組件相關(guān)(因此,如果您不使用 ,它不應(yīng)該被列為存根)

希望有幫助, 干杯!

最新下載
更多>
網(wǎng)站特效
網(wǎng)站源碼
網(wǎng)站素材
前端模板