Laravel5.5的Testing无法请求远程地址问题

使用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);之后有执行远程请求的

阅读 1.7k
1 个回答

laravel的测试是这样的。如果要测请求服务器,要自己改改。把里面的 app 换成远程的。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进