Here is an example code:
package main
import (
"net/http"
)
func Home(w http.ResponseWriter, r *http.Request) {
w.Write([]byte("Hello, world!"))
}
func Router() *http.ServeMux {
mux := http.NewServeMux()
mux.HandleFunc("/", Home)
return mux
}
func main() {
mux := Router()
http.ListenAndServe(":8080", mux)
}
This is the test case I wrote:
package main
import (
"net/http"
"net/http/httptest"
"testing"
)
func TestMain(t *testing.T) {
w := httptest.NewRecorder()
r, _ := http.NewRequest("GET", "/", nil)
Router().ServeHTTP(w, r)
if w.Body.String() != "Hello, world!" {
t.Error("Wrong content:", w.Body.String())
}
}
Is this test really sending an HTTP request through a TCP socket and reaching the end point /
? Or this is just calling the function without making an HTTP connection?
Update
Based on the answer given by @ffk I wrote the test like this:
func TestMain(t *testing.T) {
ts := httptest.NewServer(Router())
defer ts.Close()
req, _ := http.NewRequest("GET", ts.URL+"/", nil)
client := http.Client{}
resp, _ := client.Do(req)
defer resp.Body.Close()
body, _ := ioutil.ReadAll(resp.Body)
if string(body) != "Hello, world!" {
t.Error("Wrong content:", string(body))
}
}