使用Laravel5.5的Testing做api测试的时候,发现无论怎么设置请求的都是本地的url。查看源码发现
vendor/laravel/framework/src/Illuminate/Foundation/Testing/Concerns/MakesHttpRequests.php
文件下有段代码
/**
* Call the given URI and return the Response.
*
* @param string $method
* @param string $uri
* @param array $parameters
* @param array $cookies
* @param array $files
* @param array $server
* @param string $content
* @return \Illuminate\Foundation\Testing\TestResponse
*/
public function call($method, $uri, $parameters = [], $cookies = [], $files = [], $server = [], $content = null)
{
$kernel = $this->app->make(HttpKernel::class);
$files = array_merge($files, $this->extractFilesFromDataArray($parameters));
$symfonyRequest = SymfonyRequest::create(
$this->prepareUrlForRequest($uri), $method, $parameters,
$cookies, $files, array_replace($this->serverVariables, $server), $content
);
$response = $kernel->handle(
$request = Request::createFromBase($symfonyRequest)
);
if ($this->followRedirects) {
$response = $this->followRedirects($response);
}
$kernel->terminate($request, $response);
return $this->createTestResponse($response);
}
其中
$response = $kernel->handle(
$request = Request::createFromBase($symfonyRequest)
);
我猜测laravel根本没有发送远程请求,而是直接构造$requset灌入kernel执行,没有发起http请求就意味着没有经过nginx,apache之类的web服务器。这样的测试跟实际生产环境有相当差异。
PS: PHP发起http请求几种方式
file_get_contents
curl
fsocket
GuzzleHttp
没有查到$kernel->handle($request);之后有执行远程请求的
laravel的测试是这样的。如果要测请求服务器,要自己改改。把里面的 app 换成远程的。