我的問題特定于 Go-kit 以及如何在其中組織代碼。我正在嘗試為以下功能編寫單元測試:func MakeHandler(svc Service, logger kitlog.Logger) http.Handler { orderHandler := kithttptransport.NewServer( makeOrderEndpoint(svc), decodeRequest, encodeResponse, ) r := mux.NewRouter() r.Handle("/api/v1/order/", orderHandler).Methods("GET") return r}編寫適當的單元測試的正確方法是什么?我見過如下例子:sMock := &ServiceMock{}h := MakeHandler(sMock, log.NewNopLogger())r := httptest.NewRecorder()req := httptest.NewRequest("GET", "/api/v1/order/", bytes.NewBuffer([]byte("{}")))h.ServeHTTP(r, req)然后測試請求的主體和標頭。但這看起來不像是適當的單元測試,因為它調用了代碼的其他部分 ( orderHandler)。是否可以只驗證返回的內容MakeHandler()而不是在請求期間?
1 回答

搖曳的薔薇
TA貢獻1793條經驗 獲得超6個贊
是的,該測試的方向是正確的。您不應該嘗試測試返回的處理程序的內部結構,因為該第三方包將來可能會以您沒有預料到的方式發生變化。
是否可以只驗證從 MakeHandler() 返回的內容而不是在請求期間?
不是很好。MakeHandler()
返回一個接口,理想情況下你會在測試中只使用接口方法。
您可以查看由返回的類型的文檔,mux.NewRouter()
看看具體類型中是否有任何字段或方法可以為您提供信息,但這可能會很痛苦 - 無論是為了理解測試(很少使用類型來了解)以及由于未來對mux
包的修改可能會如何影響您的代碼而不破壞測試。
編寫適當的單元測試的正確方法是什么?
你的例子實際上是在正確的方向。測試時MakeHandler()
,您正在測試它返回的處理程序是否能夠處理所有路徑并為每個路徑調用正確的處理程序。所以你需要調用這個 ServeHTTP()
方法,讓它做它自己的事情,然后測試它是否正常工作。僅內省處理程序并不能保證實際使用過程中的正確性。
不過,您可能需要發出實際有效的請求,以便能夠根據響應正文或標頭了解調用了哪個處理程序。這應該使測試達到一個相當合理的狀態。(我想你已經有了)
同樣,我會為將來添加的每條路線添加一個基本的子測試。詳細的處理程序測試可以寫在單獨的函數中。
- 1 回答
- 0 關注
- 107 瀏覽
添加回答
舉報
0/150
提交
取消