2015-05-19 6 views
3

Вот пример кода:Как написать интеграционные тесты для кода 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)) 
    } 
} 
+0

Ваши два вопроса в тексте не соответствуют названию вопроса. – inf

+0

@inf Я с нетерпением жду, чтобы написать интеграционные тесты в Go с 'net/http'. Вышеупомянутый код - это то, что я планирую взять за основу. С последними двумя вопросами я пытался объяснить ключевую интеграцию, которую мне нужно проверить. Есть ли у вас предложение улучшить название или два последних вопроса? – baijum

+1

Ваш пример теста не делает фактический HTTP-запрос. 'httptest.NewRecorder()' просто создает реализацию 'http.ResponseWriter', которая позволяет записывать то, что написал ваш обработчик http. Это прекрасный подход к проверке маршрутов http. Альтернатива - это на самом деле создание и запуск вашего кода при выполнении фактических HTTP-запросов из ваших тестов. – jmaloney

ответ

1

Если вы хотите создать экземпляр тестовый сервер доступный по случайному TCP-порт 127.0. 0,1, используйте следующее:

httpHandler := getHttpHandler() // of type http.Handler 
testServer := httptest.NewServer(httpHandler) 
defer testServer.Close() 
request, err := http.NewRequest("GET", testServer.URL+"/my/url", nil) 
client := http.Client{} 
response, err := client.Do(request) 

Для получения дополнительной информации см https://golang.org/pkg/net/http/httptest/#NewServer

Смежные вопросы