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

标签 go go-http

在尝试设置两个不同的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。问题现在归结为“如何深度复制该请求。”

最佳答案

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

解决方案

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

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

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

关于go - web.Request 结构的字段状态未在 Golang 中正确克隆,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52277317/

相关文章:

go - 什么时候在 golang 中使用劫持?

http - 从网址中删除结尾的斜杠-转到静态服务器

Golang 的 Github Oauth token

go - 解析 RSA 公钥时出错

mysql - golang mysql 驱动程序在参数替换时失败

json - 如何使用不同类型的同一变量进行解码

go - 阻止来自 gorilla/mux 的打开 URL 重定向

go - 如何同时搜索一大片 maps[string]string

arrays - 在 Go 中如何访问类型为 []interface{} 的数组的某些部分?