在尝试设置两种不同的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
}
我基本上只是把它带入这个测试,并使用它,在我需要的每个虚假请求中点击它一次。
- 1 回答
- 0 关注
- 67 浏览
添加回答
举报
0/150
提交
取消