Состояние поля 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
}

Я просто привел его в этот тест и использовал его, нажимая один раз на ложный запрос, который мне был нужен.

Другие вопросы по тегам