web.Request 结构的字段状态未在 Golang 中正确克隆
field state of web.Request struct not cloning properly in Golang
在尝试设置两种不同的 web.Request
状态以供某些测试用例使用时,一种没有任何 headers 而另一种有,我 运行 遇到问题:
设置
我创建 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")
测试结果
失败了。
为什么会这样,我怎样才能实现我正在尝试的目标?
更新:我找到了罪魁祸首:
由httptest.NewRequest
返回的底层http.Request
实际上是一个指针。 Header
只是属于那个 Request
。现在问题减少到 "How to deep-copy that 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
}
我基本上只是将它带入这个测试,并使用它,在我需要的每个虚假请求中点击一次。
在尝试设置两种不同的 web.Request
状态以供某些测试用例使用时,一种没有任何 headers 而另一种有,我 运行 遇到问题:
设置
我创建 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")
测试结果
失败了。
为什么会这样,我怎样才能实现我正在尝试的目标?
更新:我找到了罪魁祸首:
由httptest.NewRequest
返回的底层http.Request
实际上是一个指针。 Header
只是属于那个 Request
。现在问题减少到 "How to deep-copy that 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
}
我基本上只是将它带入这个测试,并使用它,在我需要的每个虚假请求中点击一次。