1

在尝试设置两种不同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”。

4

1 回答 1

0

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

解决方案

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

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

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

于 2018-09-11T16:23:38.160 回答