为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
鸿蒙传说 2023-04-04 14:22:00
在尝试设置两种不同的web.Request状态以用于某些测试用例时,一种没有任何标题,另一种有,我遇到了问题:设置我创建fakeRequest,fakeRequestNoHeaders因此:// create fake requestfakeRequest := new(web.Request)fakeRequest.Request = httptest.NewRequest("GET",    fakeServer.URL,    nil)fakeRequestNoHeaders := new(web.Request)fakeRequestNoHeaders.Request = fakeRequest.Request// give fakeRequest some headersfakeRequest.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 回答

?
ITMISS

TA贡献1871条经验 获得超8个赞

事实上,问题不在于字段Header,而在于Request字段,它是一个指针。(哦不!我不小心浅拷贝了)


解决方案


我记得,在我之前的一个测试中,我专门写了一个方法来解决这个问题:


func makeBasicRequest() *web.Request {

    baseReq := httptest.NewRequest(http.MethodPost,

        "[some url here]",

        nil)

    req := new(web.Request)

    req.Request = baseReq

    return req

}

我基本上只是把它带入这个测试,并使用它,在我需要的每个虚假请求中点击它一次。


查看完整回答
反对 回复 2023-04-04
  • 1 回答
  • 0 关注
  • 67 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信