Функция httptest.NewRequest

Функция httptest.NewRequest создает новый HTTP-запрос, который можно использовать в тестах для проверки обработчиков. Первый параметр принимает HTTP-метод (например, "GET", "POST"), второй параметр принимает URL-путь, а третий параметр принимает тело запроса в виде io.Reader или nil, если тело не требуется. Функция возвращает указатель на http.Request, который можно передать в тестируемый обработчик.

Синтаксис

gohttptest.NewRequest(method, target string, body io.Reader) *http.Request

Пример

Давайте создадим GET-запрос к пути "/users" без тела запроса:

gopackage main

import (
  "fmt"
  "net/http"
  "net/http/httptest"
)

func main() {
  req := httptest.NewRequest("GET", "/users", nil)
  fmt.Println(req.Method)
  fmt.Println(req.URL.Path)
}

Результат выполнения кода:

go"GET"
"/users"

Пример

Давайте создадим POST-запрос с JSON-телом для создания нового пользователя:

gopackage main

import (
  "bytes"
  "fmt"
  "net/http"
  "net/http/httptest"
)

func main() {
  jsonBody := []byte(`{"name":"John","age":30}`)
  req := httptest.NewRequest("POST", "/users", bytes.NewReader(jsonBody))
  fmt.Println(req.Method)
  fmt.Println(req.URL.Path)
  fmt.Println(req.Header.Get("Content-Type"))
}

Результат выполнения кода:

go"POST"
"/users"
""

Обратите внимание, что заголовок Content-Type не устанавливается автоматически - его нужно добавлять вручную при необходимости.

Пример

Давайте создадим запрос с пользовательскими заголовками:

gopackage main

import (
  "fmt"
  "net/http"
  "net/http/httptest"
)

func main() {
  req := httptest.NewRequest("GET", "/profile", nil)
  req.Header.Set("Authorization", "Bearer token123")
  req.Header.Set("X-Request-ID", "12345")

  fmt.Println(req.Header.Get("Authorization"))
  fmt.Println(req.Header.Get("X-Request-ID"))
}

Результат выполнения кода:

go"Bearer token123"
"12345"

Пример

Давайте создадим запрос с параметрами в URL:

gopackage main

import (
  "fmt"
  "net/http"
  "net/http/httptest"
)

func main() {
  req := httptest.NewRequest("GET", "/search?q=golang&page=2", nil)
  query := req.URL.Query()

  fmt.Println(query.Get("q"))
  fmt.Println(query.Get("page"))
}

Результат выполнения кода:

go"golang"
"2"

Смотрите также

  • структуру httptest.ResponseRecorder,
    которая используется для записи ответов обработчиков в тестах
  • пакет httptest,
    который предоставляет инструменты для тестирования HTTP-серверов
  • функцию testing.T.Run,
    которая запускает подтесты для организации тестов
  • функцию testing.T.Log,
    которая выводит отладочную информацию во время выполнения теста