Минимальный тест службы HTTP без сброса маршрутов? - PullRequest
0 голосов
/ 15 мая 2019

Скажем, у меня очень простой веб-сервис.

func main() {
    http.HandleFunc("/", sanityTest)
    log.Fatal(http.ListenAndServe(":8000", nil))
}

Если я хочу протестировать его, я мог бы минимально просто иметь:

func ExampleTest() {
        server := httptest.NewServer(http.DefaultServeMux)
        defer server.Close()

        resp, err := http.Get(server.URL)
        if err != nil {
                log.Fatal(err)
        }
        body, _ := ioutil.ReadAll(resp.Body)

        fmt.Println(resp.StatusCode)
        fmt.Println(resp.Header.Get("Content-Type"))
        fmt.Println(string(body))

        // Output:
        // 200
        // text/plain; charset=utf-8
        // OK

}

Но это приведет к 404, так как он не знает о маршрутах.То, что я видел в коде main_test.go, это переустановка дескрипторов в инициализации тестового файла, например:

func init() {
    http.HandleFunc("/", sanityTest)
}

, что приводит к дублированию, и я неизбежно должен создать функцию вmain.go вроде:

func setupRoutes() {
        http.HandleFunc("/", sanityTest)
}

Что я нахожу немного уродливым.Я пропустил трюк для создания экземпляров маршрутов из main.go и избежать инициализации?

1 Ответ

2 голосов
/ 15 мая 2019

Вы можете повторно использовать маршруты между тестами и файлом main.go, также полезно, если вы хотите что-то смоделировать в своих обработчиках (добавьте новый аргумент в router() func ниже)

main.go:

func sanityTest(w http.ResponseWriter, r *http.Request) {
    fmt.Fprintf(w, "%s", "sanity test")
}

func router() *http.ServeMux {
    h := http.NewServeMux()
    h.HandleFunc("/", sanityTest)
    return h
}

func main() {
    http.ListenAndServe(":8080", router())
}

main_test.go:

func TestSanity(t *testing.T) {
    tests := []struct {
        name string
        uri  string
        want string
    }{
        {"1", "/", "sanity test"},
    }

    ts := httptest.NewServer(router())
    defer ts.Close()

    for _, tt := range tests {
        t.Run(tt.name, func(t *testing.T) {
            url := ts.URL + tt.uri
            resp, _ := http.Get(url)
            respBody, _ := ioutil.ReadAll(resp.Body)
            resp.Body.Close()

            got := string(respBody)
            if got != tt.want {
                t.Errorf("got %s, Want %s", got, tt.want)
            }
        })
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...