Каким образом тестировать функции сервера

Всем привет

Немного не понимаю, как тестировать сервер. В источниках о тестировании в качестве входного параметра применяется *tesing.T , а что если мне нужно протестировать функцию которая имеет в качестве входного параметра w http.ResponseWriter, r *http.Request?

Например как быть если я хочу протестировать функцию

func GetAllUserDataForReg(w http.ResponseWriter, r *http.Request) []byte {
    r.ParseForm()
    data := &myjson.JSONRequest{}
    data.Password, _ = bcrypt.GenerateFromPassword([]byte(r.FormValue("password")), 12)
    data.Username = r.FormValue("username")
    data.Email = r.FormValue("email")
    data.Token = shortuuid.New()
    data.Useragent = r.Header.Get("User-Agent")
    data.Host, _, _ = net.SplitHostPort(r.RemoteAddr)
    data.ExistsUser, _, _ = dbclient.ExistsUser(data.Username)
    data.PasswordEmpty = bcrypt.CompareHashAndPassword(data.Password, []byte("")) == nil
    marsh, err := json.Marshal(data)
    if err != nil {
        logrus.Error(err)
    }

    return marsh
}

Как будет выглядеть тест такой функции?


Ответы (1 шт):

Автор решения: Senior Pomidor

создайте файл, имя которого заканчивается _test, чтобы гошный тестовый фреймворк понял, что это тестовый файл. имя теста должна начинаться с Test_, аргумент должен быть либо *testing.T, либо *testing.TB

Язык из коробки предотсавляет пакеты для тестирования, например "net/http/httptest"

func Test_GetAllUserDataForReg(t *testing.T) {
    reqURL := "/my/url"
    reqBody := "testdata"
    wantHTTPStatus := 200
    wantPayload := `testdata`

    resp := httptest.NewRecorder()
    req, err := http.NewRequest(http.MethodPost, reqURL, strings.NewReader(reqBody))
    require.NoError(t, err)

    retData := GetAllUserDataForReg(resp, req)

    require.Equal(t, wantHTTPStatus, resp.Code)
    require.Equal(t, wantPayload, string(retData))
    require.Equal(t, wantPayload, resp.Body.String())
}

func GetAllUserDataForReg(w http.ResponseWriter, r *http.Request) []byte {
    bodyBytes, err := io.ReadAll(r.Body)
    if err != nil {
        panic(err)
    }
    defer r.Body.Close()

    // обычно нужно отвечать чрез ResponseWriter. 
    // просто добавил ради примера  
    fmt.Fprintf(w, string(bodyBytes))
    return bodyBytes
}

→ Ссылка