真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

在Vue項(xiàng)目中使用snapshot測試的具體使用

snapshot介紹

專注于為中小企業(yè)提供成都網(wǎng)站設(shè)計(jì)、做網(wǎng)站、成都外貿(mào)網(wǎng)站建設(shè)公司服務(wù),電腦端+手機(jī)端+微信端的三站合一,更高效的管理,為中小企業(yè)蘭山免費(fèi)做網(wǎng)站提供優(yōu)質(zhì)的服務(wù)。我們立足成都,凝聚了一批互聯(lián)網(wǎng)行業(yè)人才,有力地推動了成百上千企業(yè)的穩(wěn)健成長,幫助中小企業(yè)通過網(wǎng)站建設(shè)實(shí)現(xiàn)規(guī)模擴(kuò)充和轉(zhuǎn)變。

snapshot測試又稱快照測試,可以直觀地反映出組件UI是否發(fā)生了未預(yù)見到的變化。snapshot如字面上所示,直觀描述出組件的樣子。通過對比前后的快照,可以很快找出UI的變化之處。

第一次運(yùn)行快照測試時會生成一個快照文件。之后每次執(zhí)行測試的時候,會生成一個快照,然后對比最初生成的快照文件,如果沒有發(fā)生改變,則通過測試。否則測試不通過,同時會輸出結(jié)果,對比不匹配的地方。

jest中的快照文件以為snap拓展名結(jié)尾,格式如下(ps: 在沒有了解之前,我還以為是快照文件是截圖)。一個快照文件中可以包含多個快照,快照的格式其實(shí)是HTML字符串,對于UI組件,其HTML會反映出其內(nèi)部的state。每次測試只需要對比字符串是否符合初始快照即可。

exports[`button 1`] = `"
1
"`;

snapshot測試不通過的原因有兩個。一個原因是組件發(fā)生了未曾預(yù)見的變化,此時應(yīng)檢查代碼。另一個原因是組件更新而快照文件并沒有更新,此時要運(yùn)行jest -u更新快照。

› 1 snapshot failed from 1 test suite. Inspect your code changes or re-run jest with -u to update them.

結(jié)合Vue進(jìn)行snapshot測試

生成快照時需要渲染并掛載組件,在Vue中可以使用官方的單元測試實(shí)用工具Vue Test Utils。

Vue Test Utils 提供了mount、shallowMount這兩個方法,用于創(chuàng)建一個包含被掛載和渲染的 Vue 組件的 Wrapper。component是一個vue組件,options是實(shí)例化Vue時的配置,包括掛載選項(xiàng)和其他選項(xiàng)(非掛載選項(xiàng),會將它們通過extend覆寫到其組件選項(xiàng)),結(jié)果返回一個包括了一個掛載組件或 vnode,以及測試該組件或 vnode 的方法的Wrapper實(shí)例。

mount(component:{Component}, options:{Object})

shallowMount與mount不同的是被存根的子組件,詳細(xì)請戳文檔。

Wrapper上的豐富的屬性和方法,足以應(yīng)付本文中的測試需求。html()方法返回Wrapper DOM 節(jié)點(diǎn)的 HTML 字符串。find()和findAll()可以查找Wrapper里的DOM節(jié)點(diǎn)或Vue組件,可用于查找監(jiān)聽事件的元素。trigger可以在DOM節(jié)點(diǎn)/組件上觸發(fā)一個事件。

結(jié)合上述的方法,我們可以完成一個模擬事件觸發(fā)的快照測試。

細(xì)心的讀者可能會發(fā)現(xiàn),我們平時在使用Vue時,數(shù)據(jù)更新后視圖并不會立即更新,需要在nextTick回調(diào)中處理更新完成后的任務(wù)。但在 Vue Test Utils 中,為簡化用法,更新是同步的,所以無需在測試中使用 Vue.nextTick 來等待 DOM 更新。

demo演示

Vue Test Utils官方文檔中提供了一個集成VTU和Jest的demo,不過這個demo比較舊,官方推薦用CLI3創(chuàng)建項(xiàng)目。

執(zhí)行vue create vue-snapshot-demo創(chuàng)建demo項(xiàng)目,創(chuàng)建時要選擇單元測試,提供的庫有Mocha + Chai及Jest,在這里選擇Jest.安裝完成之后運(yùn)行npm run serve即可運(yùn)行項(xiàng)目。

本文中將用一個簡單的Todo應(yīng)用項(xiàng)目來演示。這個Todo應(yīng)用有簡單的添加、刪除和修改Todo項(xiàng)狀態(tài)的功能;Todo項(xiàng)的狀態(tài)有已完成和未完成,已完成時不可刪除,未完成時可刪除;已完成的Todo項(xiàng)會用一條線橫貫文本,未完成項(xiàng)會在鼠標(biāo)懸浮時展示刪除按鈕。

組件簡單地劃分為Todo和TodoItem。TodoItem在Todo項(xiàng)未完成且觸發(fā)mouseover事件時會展示刪除按鈕,觸發(fā)mouseleave時則隱藏按鈕(這樣可以在快照測試中模擬事件)。TodoItem中有一個checkbox,用于切換Todo項(xiàng)的狀態(tài)。Todo項(xiàng)完成時會有一個todo-finished類,用于實(shí)現(xiàn)刪除線效果。

為方便這里只介紹TodoItem組件的代碼和測試。




進(jìn)行快照測試時,除了測試數(shù)據(jù)渲染是否正確外還可以模擬事件。這里只貼快照測試用例的代碼,完整的代碼戳我。

describe('TodoItem snapshot test', () => {
  it('first render', () => {
    const wrapper = shallowMount(TodoItem, {
      propsData: {
        item: {
          finished: true,
          content: 'test TodoItem'
        }
      }
    })
    expect(wrapper.html()).toMatchSnapshot()
  })

  it('toggle checked', () => {
    const renderer = createRenderer();
    const wrapper = shallowMount(TodoItem, {
      propsData: {
        item: {
          finished: true,
          content: 'test TodoItem'
        }
      }
    })
    const checkbox = wrapper.find('input');
    checkbox.trigger('click');
    renderer.renderToString(wrapper.vm, (err, str) => {
      expect(str).toMatchSnapshot()
    })
  })
  
  it('mouseover', () => {
    const renderer = createRenderer();
    const wrapper = shallowMount(TodoItem, {
      propsData: {
        item: {
          finished: false,
          content: 'test TodoItem'
        }
      }
    })
    wrapper.trigger('mouseover');
    renderer.renderToString(wrapper.vm, (err, str) => {
      expect(str).toMatchSnapshot()
    })
  })
})

這里有三個測試。第二個測試模擬checkbox點(diǎn)擊,將Todo項(xiàng)從已完成切換到未完成,期待類todo-finished會被移除。第三個測試在未完成Todo項(xiàng)上模擬鼠標(biāo)懸浮,觸發(fā)mouseover事件,期待刪除按鈕會展示。

這里使用toMatchSnapshot()來進(jìn)行匹配快照。這里生成快照文件所需的HTML字符串有wrapper.html()和Renderer.renderToString這兩種方式,區(qū)別在于前者是同步獲取,后者是異步獲取。

測試模擬事件時,最好以異步方式獲取HTML字符串。同步方式獲取的字符串并不一定是UI更新后的視圖。

盡管VTU文檔中說所有的更新都是同步,但實(shí)際上在第二個快照測試中,如果使用expect(wrapper.html()).toMatchSnapshot(),生成的快照文件中Todo項(xiàng)仍有類todo-finished,期待的結(jié)果應(yīng)該是沒有類todo-finished,結(jié)果并非更新后的視圖。而在第三個快照測試中,使用expect(wrapper.html()).toMatchSnapshot()生成的快照,按鈕如期望展示,是UI更新后的視圖。所以才不建議在DOM更新的情況下使用wrapper.html()獲取HTML字符串。

下面是兩種對比的結(jié)果,1是使用wrapper.html()生成的快照,2是使用Renderer.renderToString生成的。

exports[`TodoItem snapshot test mouseover 1`] = `
  • test TodoItem
  • `; exports[`TodoItem snapshot test mouseover 2`] = `
  • test TodoItem
  • `; exports[`TodoItem snapshot test toggle checked 1`] = `
  • test TodoItem
  • `; exports[`TodoItem snapshot test toggle checked 2`] = `
  • test TodoItem
  • `;

    這里使用vue-server-renderer提供的createRenderer來生成一個Renderer實(shí)例,實(shí)例方法renderToString來獲取HTML字符串。這種是典型的回調(diào)風(fēng)格,斷言語句在回調(diào)中執(zhí)行即可。

      // ...
      wrapper.trigger('mouseover');
      renderer.renderToString(wrapper.vm, (err, str) => {
        expect(str).toMatchSnapshot()
      })
    

    如果不想使用這個庫,也可以使用VTU中提供的異步案例。由于wrapper.html()是同步獲取,所以獲取操作及斷言語句需要在Vue.nextTick()返回的Promise中執(zhí)行。

      // ...
      wrapper.trigger('mouseover');
      Vue.nextTick().then(()=>{
        expect(wrapper.html()).toMatchSnapshot()
      })

    觀察測試結(jié)果

    執(zhí)行npm run test:unit或yarn test:unit運(yùn)行測試。

    初次執(zhí)行,終端輸出會有Snapshots: 3 written, 3 total這一行,表示新增三個快照測試,并生成初始快照文件。

     › 3 snapshots written.
    Snapshot Summary
     › 3 snapshots written from 1 test suite.
    
    Test Suites: 1 passed, 1 total
    Tests:    7 passed, 7 total
    Snapshots:  3 written, 3 total
    Time:    2.012s
    Ran all test suites.
    Done in 3.13s.
    
    

    快照文件如下示:

    // Jest Snapshot v1, https://goo.gl/fbAQLP
    
    exports[`TodoItem snapshot test first render 1`] = `
  • test TodoItem
  • `; exports[`TodoItem snapshot test mouseover 1`] = `
  • test TodoItem
  • `; exports[`TodoItem snapshot test toggle checked 1`] = `
  • test TodoItem
  • `;

    第二次執(zhí)行測試后,輸出中有Snapshots: 3 passed, 3 total,表示有三個快照測試成功通過,總共有三個快照測試。

    Test Suites: 1 passed, 1 total
    Tests:    7 passed, 7 total
    Snapshots:  3 passed, 3 total
    Time:    2s
    Ran all test suites.
    Done in 3.11s.
    

    修改第一個快照中傳入的content,重新運(yùn)行測試時,終端會輸出不匹配的地方,輸出數(shù)據(jù)的格式與Git類似,會標(biāo)明哪一行是新增的,哪一行是被刪除的,并提示不匹配代碼所在行。

      - Snapshot
      + Received
    
      - 
  • test TodoItem
  • +
  • test TodoItem content change
  • 88 | } 89 | }) > 90 | expect(wrapper.html()).toMatchSnapshot() | ^ 91 | }) 92 | 93 | it('toggle checked', () => { at Object.toMatchSnapshot (tests/unit/TodoItem.spec.js:90:32)

    同時會提醒你檢查代碼是否錯誤或重新運(yùn)行測試并提供參數(shù)-u以更新快照文件。

    Snapshot Summary
     › 1 snapshot failed from 1 test suite. Inspect your code changes or re-run jest with `-u` to update them.
    

    執(zhí)行npm run test:unit -- -u或yarn test:unit -u更新快照,輸出如下示,可以發(fā)現(xiàn)有一個快照測試的輸出更新了。下次快照測試對照的文件是這個更新后的文件。

    Test Suites: 1 passed, 1 total
    Tests:    7 passed, 7 total
    Snapshots:  1 updated, 2 passed, 3 total
    Time:    2.104s, estimated 3s
    Ran all test suites.
    Done in 2.93s.
    

    其他

    除了使用toMatchSnapshot()外,還可以使用toMatchInlineSnapshot()。二者不同之處在于toMatchSnapshot()從快照文件中查找快照,而toMatchInlineSnapshot()則將傳入的參數(shù)當(dāng)成快照文件進(jìn)行匹配。

    配置Jest

    Jest配置可以保存在jest.config.js文件里,可以保存在package.json里,用鍵名jest表示,同時也允許行內(nèi)配置。

    介紹幾個常用的配置。

    rootDir

    查找Jest配置的目錄,默認(rèn)是pwd。

    testMatch

    jest查找測試文件的匹配規(guī)則,默認(rèn)是[ "**/__tests__/**/*.js?(x)", "**/?(*.)+(spec|test).js?(x)" ]。默認(rèn)查找在__test__文件夾中的js/jsx文件和以.test/.spec結(jié)尾的js/jsx文件,同時包括test.js和spec.js。

    snapshotSerializers

    生成的快照文件中HTML文本沒有換行,是否能進(jìn)行換行美化呢?答案是肯定的。

    可以在配置中添加snapshotSerializers,接受一個數(shù)組,可以對匹配的快照文件做處理。jest-serializer-vue這個庫做的就是這樣任務(wù)。

    如果你想要實(shí)現(xiàn)這個自己的序列化任務(wù),需要實(shí)現(xiàn)的方法有test和print。test用于篩選處理的快照,print返回處理后的結(jié)果。

    后記

    在未了解測試之前,我一直以為測試是枯燥無聊的。了解過快照測試后,我發(fā)現(xiàn)測試其實(shí)蠻有趣且實(shí)用,同時由衷地感嘆快照測試的巧妙之處。如果這個簡單的案例能讓你了解快照測試的作用及使用方法,就是我最大的收獲。

    如果有問題或錯誤之處,歡迎指出交流。

    參考鏈接

    vue-test-utils-jest-example
    Jest - Snapshot Testing
    Vue Test Utils
    Vue SSR 指南

    以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持創(chuàng)新互聯(lián)。


    文章名稱:在Vue項(xiàng)目中使用snapshot測試的具體使用
    轉(zhuǎn)載源于:http://weahome.cn/article/jsjigg.html

    其他資訊

    在線咨詢

    微信咨詢

    電話咨詢

    028-86922220(工作日)

    18980820575(7×24)

    提交需求

    返回頂部