簡介 Intro
這陣子為了交付各項文件,以及為了往後系統開發的流暢,接觸了許多DevOps相關的技術
本次章節打算來說一說Jest與supertest搭配Github Action的組合應用
前言
在網路上有很多關於DevOps、CI/CD相關的呼聲,幾乎快跟雲平台、AI名詞爛大街了
但實際上能夠參考的中文文章有限,很多都只是淺嘗即止。
不然就都是全英文的文章,對於我這種野生開發者來說,實在是太吃力了。
(良心建議英文要學好RRRRRRR)
那接續上一篇關於JSDoc的文章,這次打算介紹的是Jest+supertest進行單元測試
並且介紹Github Action的配置,但整體而言內容會很多,所以這個主題可能會分多篇文章寫完
技術使用簡介
Jest
Jest是由Facebook維護的JavaScript測試框架,由Christoph Nakazawa設計和構建,重點是簡化和支持大型Web應用程序。…
supertest
supertest是一個用來模擬Http Request的套件,用來測試webserver實很實用
Github Action
雖然本次文章不會說到這個階段,但還是附上官方文件連結
單元測試
好啦~ 由於本人精力與時間都實在有限就直接切入正題
當我們的專案隨越來越大時,所使用的套件也會越來越多
不論是自己寫的模組也好,還是引用外部的第三方模組
跟著主流的中文單元測試教學文件都會遇到一個問題
Jest在進行測試時,會因為無法正常處理axios、socket.io-client、mqtt
導致單元測試失效,要解決這個問題還得回到官方文檔
簡單來說,在Jest的測試框架環境下,我們需要使用他所提供的mock模擬一個假的元件騙自己
程式碼模擬
假設我們的routes/index.js內容如下:
1 | const express = require("express"); |
然後我們的example.test.js的內容為:
1 | const supertest = require("supertest"); |
我們的package.json配置:
1 | { |
神奇的錯誤
然而當我們開開心心運行npm test時,就會跳錯 (這邊有空再附上圖片)
大概要馬告訴你timeout,不然就是說你可能promise沒結束,又或是說他不認得axios (欠扁!)
這並不是因為配置出錯,也許他會提示你使用 –detectOpenHandles 參數,但其實一點也沒解決問題
1 | npm test -- --detectOpenHandles |
解決辦法
解鈴還須繫鈴人
而我們需要在*.test.js中(也就是你單元測試的腳本),進行一些更動
原本的內容都保持不動,我們要使用jest.mock模擬需要的元件
1 | const supertest = require("supertest"); |
成功解決問題
將一切存檔之後我們再執行一次給他一個機會
1 | npm test |

還好成功了,不然就要開扁了(誤)
基本上這是一個比較粗糙的解決辦法,但若是要詳細說明,篇幅實在太長
往後再慢慢加入解說
順帶一提
環境變數傳遞及Jest參數簡述
當使用npm test進行測試時,可以透過– –param 傳遞環境參數
1 | Example1 |
結語
這只是CI/CD的開頭,路漫漫其修遠兮, 吾將上下而求索。
雖然過聖誕節一天了,還是祝各位開發者佳節愉悅
也歡迎各位大大指教及交流