Вот пример кода:Как написать интеграционные тесты для кода net/http?
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)
}
Это тест я написал:
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())
}
}
Является ли этот тест действительно посылает запрос HTTP через сокет TCP и достижении конечной точки /
? Или это просто вызов функции без HTTP-соединения?
Update
Исходя из ответа, данного @ffk я написал тест так:
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))
}
}
Ваши два вопроса в тексте не соответствуют названию вопроса. – inf
@inf Я с нетерпением жду, чтобы написать интеграционные тесты в Go с 'net/http'. Вышеупомянутый код - это то, что я планирую взять за основу. С последними двумя вопросами я пытался объяснить ключевую интеграцию, которую мне нужно проверить. Есть ли у вас предложение улучшить название или два последних вопроса? – baijum
Ваш пример теста не делает фактический HTTP-запрос. 'httptest.NewRecorder()' просто создает реализацию 'http.ResponseWriter', которая позволяет записывать то, что написал ваш обработчик http. Это прекрасный подход к проверке маршрутов http. Альтернатива - это на самом деле создание и запуск вашего кода при выполнении фактических HTTP-запросов из ваших тестов. – jmaloney