Test double 測試替身
測試替身最主要是透過封裝好的函式來協助開發者模擬一些函式、功能、模組所返回的值。
像是 Mocha.js 就會搭配像是 Sinon.js 這一類的隔離庫來使用測試替身。而 Jest 本身核心概念是屬於 batteries-included 類型的框架(即為你需要的功能,框架都盡量幫你準備好了),因此 Jest 在模擬測試替身上則是看 Jest 本身的 Mock API 即可!
在執行測試時,有時候會需要初始化一些基本資料以供測試進行,並且在測試完畢的時候要讓測試後的資料復原、整理。
而 Jest 在這方面提供的 API 如下:
it()
)由於 JavaScript 在瀏覽器的宿主環境裡擁有單線程(single thread)的特性,使得在程式執行時期(Run time)中一些有關非同步(Asynchronous)的操作會等到主線程(Main thread)整個操作結束後才會回來執行處在任務序列(Event queue)中的非同步操作。
因此在測試中,如果遇到有關非同步的操作時,測試程式碼的執行順序(主線程)會先於任務序列,造成測試還未來得及收到非同步執行後的結果,進而導致測試失敗的產出。
我們能做的做法便是要將測試程式碼運行結束的時間,拖延至任務序列當中,讓測試套件(Test suit)中非同步的結果產出之後,才來進行測試中的斷言。
而在 Jest.js 解決這一類非同步測試的問題時,有提供了實際 API 的作法以供參考:
在測試庫中,斷言(assertion)是一個很重要的概念,意思即為開發程式中執行完畢時,程式碼執行結果應與斷言所設定的結果一致,否則該處斷言碼會拋出錯誤的意思。你可能已經在某些情況下「斷言」過好幾次了,例如在 JavaScript 裡面使用全等比較(===
)來比較兩者的資料類型是否一致,這便是斷言。而在 Jest.js 框架中,Jest 選擇的是使用 Matchers 配對器這個名稱,兩者其實在概念上是差不多的東西。
Jest.js 中的配對器(Matchers),主要採用的是 expect()
的方法,但 Jest.js 中的 expect 與 Node.js 和其他斷言庫(如 Chai.js)中的 expect()
是不一樣的,別搞混了!XD,我自認為比較好辨識 Jest 方法是當斷言中出現了 expect().toBe()
這個東西,基本上看到這個可以確認大概率是使用 Jest.js 了。
而為什麼辨識文件中是用誰家的斷言有一點小重要的點是,當你試著按照例如 Vue.js 的測試文件 Vue-test-utils 測試時,可能會遇到斷言方法 API 不一樣的情況,那麼你可能得回去翻翻其他斷言庫本身的斷言 API 文件了。
今天要介紹的是對單頁式應用網站(SPA,Single Page Application) 非常重要的 Router, SPA 為何會需要 Router 來處理網頁路徑呢?這裡簡單介紹一下他們之間的關係:
在 SPA 技術被大肆使用之前,以前的網站多是採用多頁式網頁(MPA,Multiple Page Application),而兩者差異最大的地方在於向伺服器請求的東西不同。
一開始不論 SPA 還是 MPA 網站都需要使用者輸入網址,透過一個叫做 DNS 的服務器找到該網站伺服器,接著經過一連串回應後,伺服器回應給使用者一個 HTML 網頁檔案。
而 MPA 在後續轉換頁面上,則是藉由輸入的網址不同,重複以上動作向網站伺服器拿取每頁的網頁檔案,並且重新渲染每頁的內容,因此會造成網頁整個畫面都被刷新。
SPA 則是進入入口網頁(SPA 進入點)後透過 AJAX 技術,跟伺服器拿取部分資料替換內容進去;而替換的區域,小至更新收藏狀態的按鈕,大至整個頁面都被刷新,此時網址列的路徑卻仍是我們一開始進去的那個 SPA 進入點網址。
因此,SPA 網頁需要藉由 History API 來操控網址列,並且藉由前端辨識使用者輸入的網頁路徑不同,而透過前端給予使用者不同的頁面內容,這也代表著原先由後端伺服器所負責的路徑管理,將交由前端來負責辨識與處理,也使得前端的複雜度上升了一個檔次。
為了使用者的品質體驗,身為前端工程師的我們當然不會因為這種小事而被擊倒,但管理路徑上確實是不容易的事情,因此工程師們逐漸發展出一系列管理路徑的方法。而在 Vue 框架中,我們可以藉由 Vue Router 來協助處理這一類的問題,這也就是今天所要提到的內容。