想說用 Node.js 開發一個後端 API 系統給自己接,在單元測試上的撰寫踩了不少陷阱。這邊筆記下必備的思路和出現錯誤訊息的處理方式。
內容
需求
1. 提供給前端網頁一個路由:接收後,會再轉發給最終目標的伺服器獲取資料。接收資料後會進行基本處理,再回傳給前端
2. 前端所傳內容,需要進行基本的驗證
套件
1. Jest – https://jestjs.io
2. Supertest – https://github.com/ladjs/supertest
思路
1. Controller 和 API 必須要是分離的。所以 Controller 的樣子會像是:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
import { NextFunction, Request, Response } from 'express' import { fetchDataAPI } from '../api' export const controller = { getProducts: async (req: Request, res: Response, _next: NextFunction) => { try { const { skuNumber, region } = req.query const results = await fetchDataAPI(region, skuNumber) res.status(200).json({ data: results })) } catch (error) { console.error(error) } }, } |
這樣一來,你在進行單元測試時,就可以用 jest 去 mock 這個 api 的回傳結果,與 controller 的其他部分給拆開來
2. jest 的 mockReturnValue 和 mockImplementation 是有差別的。前者會立刻執行,因此你的外部 import 進來的內容就會出現 jest ReferenceError: Cannot access ” before initialization。後者則是被呼叫到時才執行。
3. 使用 supertest 套件要搭配 app.js(ts),請記得 export app
4. jest 的 mockReturnValue 和 mockImplementation 可讓每一次呼叫都有不同的值,可參考這篇
參考資料
1. jest ReferenceError: Cannot access ” before initialization
按讚加入粉絲團