在尝试设置两种不同的web.Request
状态以用于某些测试用例时,一种没有任何标头,一种带有标头,我遇到了问题:
设置
我这样创建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")
测试结果
失败。
为什么会这样,我如何才能实现自己的目标?
更新:我找到了罪魁祸首:
由http.Request
返回的基础httptest.NewRequest
实际上是一个指针。 Header
仅属于Request
。现在,该问题简化为“如何深度复制该Request
”。
答案 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
我基本上只是将它带入了该测试,并使用了它,并在我需要的每个伪造请求中将其击中了一次。