Каким образом тестировать функции сервера
Всем привет
Немного не понимаю, как тестировать сервер. В источниках о тестировании в качестве входного параметра применяется *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
}