Состояние поля web.Request структура не клонируется должным образом в Golang
В попытке настроить два разных web.Request
состояния для использования в некоторых тестовых случаях, один без заголовков и один с, я сталкиваюсь с проблемой:
Настроить
я создаю fakeRequest
, fakeRequestNoHeaders
таким образом:
// create fake request
fakeRequest := new(web.Request)
fakeRequest.Request = httptest.NewRequest("GET",
fakeServer.URL,
nil)
fakeRequestNoHeaders := new(web.Request)
fakeRequestNoHeaders.Request = fakeRequest.Request
// give fakeRequest some headers
fakeRequest.Header.Add("Authorization", "Bearer ksjaf;oipyu7")
fakeRequest.Header.Add("Scope", "test")
Тест на психику
Я ожидаю, конечно, что fakeRequest.Header != fakeRequestNoHeaders.Header
, Я пишу этот тест:
t.Run("HeadersSanityTest", func(t *testing.T) {
assert.NotEqualf(t,
fakeRequest.Header,
fakeRequestNoHeaders.Header,
"fakeRequest,fakeRequestNoHeaders share the same header state")
Результат теста
Это не удается.
Почему это так и как мне добиться того, что я пытаюсь?
ОБНОВЛЕНИЕ: я нашел виновника:
основной http.Request
, возвращенный httptest.NewRequest
на самом деле указатель. Header
просто принадлежит к этому Request
, Теперь проблема сводится к тому, "Как глубоко Request
".
1 ответ
Вопрос был, действительно, не с Header
поле, но вместо Request
поле, которое было указателем. (О нет! Я случайно копировал)
Решение
В одном из моих предыдущих тестов я вспомнил метод, который я специально написал, чтобы обойти это:
func makeBasicRequest() *web.Request {
baseReq := httptest.NewRequest(http.MethodPost,
"[some url here]",
nil)
req := new(web.Request)
req.Request = baseReq
return req
}
Я просто привел его в этот тест и использовал его, нажимая один раз на ложный запрос, который мне был нужен.