在Go 中使用即時請求測試HTTP 伺服器
目前的問題涉及確保HTTP 處理函數正確回應各種HTTP 請求方法(GET和POST)在實時伺服器場景。這需要在實際伺服器的上下文中測試處理程序,而不是僅僅依賴單元測試。
為了實現這一點,net/http/httptest.Server 類型提供了一個解決方案。它允許創建使用特定路由器的即時伺服器。路由器可以基於 Gorilla mux(如問題中提到的)、net/http 的 ServeMux 或任何其他滿足 net/http 處理程序介面的實作。
這裡是如何設定即時伺服器的範例using httptest.Server:
<code class="go">import ( "io" "net/http" "net/http/httptest" "testing" ) func TestIndex(t *testing.T) { // Create a server using the router initialized outside the test function. ts := httptest.NewServer(router) defer ts.Close() // Create a function to generate a request with the desired method and URL. newreq := func(method, url string, body io.Reader) *http.Request { r, err := http.NewRequest(method, url, body) if err != nil { t.Fatal(err) } return r } // Define test cases with various requests. tests := []struct { name string r *http.Request }{ {name: "1: testing get", r: newreq("GET", ts.URL+"/", nil)}, {name: "2: testing post", r: newreq("POST", ts.URL+"/", nil)}, // Note: POST requests require a reader in the body } // Run tests with live requests to the server. for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { resp, err := http.DefaultClient.Do(tt.r) defer resp.Body.Close() if err != nil { t.Fatal(err) } // Check for expected response in the live server's response here. }) } }</code>
在此範例中,假設路由器在測試函數之外進行初始化。然後使用路由器建立 httptest.Server 並在測試完成時關閉。 newreq 函數用於產生具有特定方法和 URL 的請求。測試用例被定義為結構體切片,以方便迭代。
透過使用 http.DefaultClient.Do() 向伺服器發送即時請求,我們可以在以下上下文中驗證處理函數的行為:一個即時伺服器。與獨立的單元測試相比,這提供了更全面的測試方法。
請注意,此答案中的方法和詳細資訊適用於實作 http.Handler 介面的任何路由器,而不僅僅是 Gorilla mux。
以上是如何在 Go 中使用即時請求測試 HTTP 伺服器處理程序?的詳細內容。更多資訊請關注PHP中文網其他相關文章!