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

时间:2018-09-11 13:40:31

标签: 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。现在,该问题简化为“如何深度复制该Request”。

1 个答案:

答案 0 :(得分:0)

实际上,问题不在于public function update(Request $request, $id) { $updateUrl = Url::findOrFail($id); $updateUrl->url = $request->input('url'); $updateUrl->description = $request->input('description'); $updateUrl->users()->sync(array_pluck($request->input('selectedTags'), 'id')); $updateUrl->save(); //THIS CODE UP TO LAST $httpCode = check_http_header($request->input('url')); $status = "UP"; $url = Url::with('latestUrlStatus','users')->findOrfail($id); $updateUrl->latestUrlStatus()->status_code = $httpCode; $updateUrl->latestUrlStatus()->status = $status; $updateUrl->push(); if($updateUrl){ return new UrlsResource($updateUrl); } } 字段,而是Header字段,它是一个指针。 (哦,不!我不小心复制了

解决方案

我在先前的一项测试中回想起一种专门为解决此问题而编写的方法:

Request

我基本上只是将它带入了该测试,并使用了它,并在我需要的每个伪造请求中将其击中了一次。