1 回答

TA貢獻1847條經(jīng)驗 獲得超7個贊
Mux 提供了兩種注入請求參數(shù)的方法——SetURLVars幫助器和使用mux.Router包裝器而不是直接調(diào)用處理程序。
SetURLVars做的正是你想要的——將否則無法訪問的參數(shù)注入到 HTTP 請求中。
這種方法很簡單,但有一個問題。使用的 URL 和注入的參數(shù)不同步。
None 禁止開發(fā)人員編寫此代碼:
// we use 2 in request path
request := httptest.NewRequest(http.MethodGet, "/todo/2", nil)
// and we use 1 in request param
request = SetURLVars(request, map[string]string{"id":"1"})
這不是很干凈的測試實踐。
我們不測試路由中的 var 名稱是否正確。我們可以item_id在 router 中使用而不是id并且測試沒有捕獲到它。
不僅如此,我們還可以在路由器定義中使用錯誤的路徑并映射不同的處理程序。如果我們犯了那個錯誤,客戶可以刪除order而不是項目。todo
如果我們在測試中使用我們的生產(chǎn)路由器,這可以解決。
假設(shè)這是我們的生產(chǎn)代碼:
func InitRouter(t TodoController) http.handler
r := mux.NewRouter()
r.HandleFunc("/todo/{id}", t.GetById).Methods(http.MethodGet)
return r
在測試中,我們可以GetById通過我們在InitRouter函數(shù)中創(chuàng)建的路由器進行測試:
func TestGetById(t *testing.T) {
// Arrange
setup()
request := httptest.NewRequest(http.MethodGet, "/todo/1", nil)
var response models.Todo
// added setup
sut := InitRouter(todoController)
// Act
// changed act - calling GetById through production router
sut.ServeHTTP(recorder, request)
// no chnages after that
result := recorder.Result()
defer result.Body.Close()
...
}
- 1 回答
- 0 關(guān)注
- 136 瀏覽
添加回答
舉報