猿问

web.Request 结构的字段状态未在 Golang 中正确克隆

在尝试设置两种不同的web.Request状态以用于某些测试用例时,一种没有任何标题,另一种有,我遇到了问题:

设置

我创建fakeRequestfakeRequestNoHeaders因此:


// 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”。


鸿蒙传说
浏览 68回答 1
1回答

ITMISS

事实上,问题不在于字段Header,而在于Request字段,它是一个指针。(哦不!我不小心浅拷贝了)解决方案我记得,在我之前的一个测试中,我专门写了一个方法来解决这个问题:func makeBasicRequest() *web.Request {    baseReq := httptest.NewRequest(http.MethodPost,        "[some url here]",        nil)    req := new(web.Request)    req.Request = baseReq    return req}我基本上只是把它带入这个测试,并使用它,在我需要的每个虚假请求中点击它一次。
随时随地看视频慕课网APP

相关分类

Go
我要回答