# JEST(For Vue)
###### tags: `Coding`
1. 安裝 vue/test-utils
```Javascript
npm install --save-dev jest @vue/test-utils
npm install --save-dev vue-jest
```
2. 在 package.json 加上
``` json
"scripts": {
"test": "jest"
},
"jest": {
"moduleFileExtensions": [
"js",
"json",
// 告訴 JEST 處理 *.vue 資料(放進package.json要刪掉這行)
"vue"
],
"transform": {
// 用 `vue-jest` 處理 `*.vue` 文件(放進package.json要刪掉這行)
".*\\.(vue)$": "vue-jest",
// 用 `babel-jest` 處理 js(放進package.json要刪掉這行)
"^.+\\.js$": "<rootDir>/node_modules/babel-jest"
},
"moduleNameMapper": {
// 支持程式中相同的 `@` -> `src` 别名(放進package.json要刪掉這行)
"^@/(.*)$": "<rootDir>/src/$1"
},
//加上這兩行的概念是對整個專案做掃描(放進package.json要刪掉這行)
"collectCoverage": true,
"collectCoverageFrom": ["**/*.{js,vue}", "!**/node_modules/**"],
//測試報告
"coverageReporters": ["html", "text-summary"]
}
```
3. 在Vue的那個資料夾,增加一個 `${vue檔名}.test.js`
```javascript=
import { shallowMount } from '@vue/test-utils'
// 上面那行是必要
import ParentComponent from './HelloWorld'
// 上面那行是>輸入你的組件
import child from './child'
// 上面那行是意指import 子 component
describe('Counter', () => {
const wrapper = shallowMount(ParentComponent)
// 上面那行是>掛載component
const wrapper1 = shallowMount(child)
// 上面那行是>掛載子component
it('renders the correct markup', () => {
//上面那行是>敘述式
wrapper.vm.increment()
//上面那行代表說 > 使用vue 的 methods(行為命令敘述)
expect(wrapper.vm.count).toBe(1)
// 上面那行代表說 > 預期count的變數為多少(預期得到敘述)
})
})
```
4. 在test.js中 可以把 wrapper.vm 看成 this
6. 行為命令敘述
- wrapper.vm.increment() > 直接操作vue的methods
- wrapper.find('button.CountAdd') > 找到button的Class 為 CountAdd的按鈕
- 然後要trigger(觸發這個button)
- 要下 button.trigger('click')
```javescript
const button = wrapper.find('button.CountAdd')
button.trigger('click')
```
- wrapper.setData({ count: 10 }) > 將vue 內的 data 的 count 值設定為 10
- wrapper.setProps({ foo: 'bar' }) > 將 vue 內的 props 的 foo 設定為 'bar'
- setSelected() > 這是一連串的動作行為
```javascript=
const options = wrapper.find('select').findAll('option') //找到option 的節點
options.at(4).setSelected() // 選擇第四個節點
```
- setChecked > 注意這邊我是使用checkbox才成功的
```htmlmixed=
<input v-model="accept" type="checkbox">
```
```javascript=
const radioInput = wrapper.find('input').setChecked() > 預設為true
wrapper.vm.Changeaccept() > 這是我在vue中寫的function,目的為改變checkbox的狀態
```
- 因為是js故也可以
```javascript=
wrapper.vm.increment()
for(let i = 1; i< 10;i++){
wrapper.vm.decreasement()
}
```
6. 預期得到敘述:==公式==
- **expect(主詞).動詞(受詞)**
- ++先決條件,如果在 template 內的第一個tag ,放上 v-if="false",所有測試將無法繼續進行++
- 主詞
- wrapper.vm.count > 直接取得vue中的data(意即this.count)
- wrapper.find('div') > 找到 div 這個元素
- wrapper.findAll('div') > 找到所有tag為 div 的元素
- 可加後綴:wrapper.findAll('div').at(0)
- wrapper.html() > 為測試「template」內的所有tag長怎樣
- wrapper.is('div') > 測試所選到的tag是否為div
- wrapper.isEmpty() > 為測試「template 內的 div 內」 是否有tag
- wrapper.find('???').isVisible() > 主要測試是否可見
- 測 v-show / display:none / visibility:hidden
- wrapper.findAll('???') > 建議加上 at(0):不然是 「or閘」
- wrapper.name() > 測試component 的名字是否為()內的字串
- wrapper.find(child).exists() > 找到子component,並驗證是否存在
- 動詞
- toBe > 是否等於
- toContain > 是否包含
- 受詞
- Number > .toBe(1)
- String > .toBe('String')
- Boolean > .toBe(true)