# Nuxt3 Vitest 筆記
## 安裝
```terminal=
$ yarn add vitest jsdom @vue/test-utils
```
## 環境配置
#### 在根目錄新增一個 vitest.config.js 檔案
安裝 `@vitejs/plugin-vue` 套件
```terminal=
$ yarn add @vitejs/plugin-vue
```
#### vitest.config.js
`plugins`: 加入使用的插件 ex: `vue`、`pinia`...(需在頂層import)。
`global`: 設定為true,則各測試程式不須引入`{ vi, expert, describe ... }`等。
`environment`: 預設為node。經實測後在Nuxt3必須設定`jsdom`或`happy-dom`(兩者擇一安裝),否則會run不起來。
`setupFiles`: 可放測試程式每次啟動/停止的共用邏輯與方法。
`resolve`: alias設定路徑,在頂層需引入`path`。
`'#import'`: 可解決Nuxt的自動引入(auto-import)功能所引起的錯誤。
```javascript=
import { defineConfig } from 'vitest/config'
import vue from '@vitejs/plugin-vue'
import path from 'path'
export default defineConfig({
plugins: [vue()],
test: {
globals: true,
environment: 'jsdom',
setupFiles: ['./test/setup-teardown.js'],
},
resolve: {
alias: {
'@': path.resolve(__dirname, './components'),
'~': path.resolve(__dirname, './pages'),
'#imports': path.resolve(__dirname, './.nuxt/imports.d.ts')
}
}
})
```
## 如何 mock useRouter 和 router.push
#### search.vue
```javascript=
<script setup>
import { ref } from 'vue'
import { useRouter } from '#imports' // 引入
const keyword = ref('')
function search(keyword = '') {
// ...
const router = useRouter()
router.push({ ... }) // 這邊有push的方法
}
</script>
```
#### search.spec.js
```javascript=
<script setup>
import { ref } from 'vue'
import { useRouter } from '#imports' // 引入
const keyword = ref('')
function search(keyword = '') {
// ...
const router = useRouter()
router.push({ ... }) // 這邊有push的方法
}
</script>
```