состояние поля web.Request структура неправильно клонируется в Golang - PullRequest
0 голосов
/ 11 сентября 2018

При попытке установить два различных состояния 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 Ответ

0 голосов
/ 11 сентября 2018

Проблема, действительно, была не в поле Header, а в поле Request, которое было указателем.(О нет! Я случайно скопировал мелко):

func makeBasicRequest() *web.Request {
    baseReq := httptest.NewRequest(http.MethodPost,
        "[some url here]",
        nil)
    req := new(web.Request)
    req.Request = baseReq
    return req
}

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

...