按照 Lumen 文件,在 unit test 中建立 HTTP request 要呼叫 $this->call(),但沒辦法自訂 header 內容。
細看實作 Laravel\Lumen\Testing\Concerns\MakesHttpRequests::call()
:
/** * 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\Http\Response */ public function call($method, $uri, $parameters = [], $cookies = [], $files = [], $server = [], $content = null) { $this->currentUri = $this->prepareUrlForRequest($uri); $symfonyRequest = SymfonyRequest::create( $this->currentUri, $method, $parameters, $cookies, $files, $server, $content ); $this->app['request'] = LumenRequest::createFromBase($symfonyRequest); return $this->response = TestResponse::fromBaseResponse( $this->app->prepareResponse($this->app->handle($this->app['request'])) ); }
從 function parameter 和 return,大概就知道使用這個方法沒辦法塞 header 值。
但是若透過 SymfonyRequest
的話,則可以設定 header 內容:
$request = SymfonyRequest::create(); $request->headers->set('acccess_token', 'ooxx');
因此,若需要自訂 header,則必須 override 原本的 call()
方法。以下是自己改寫的 trait:
use Illuminate\Testing\TestResponse; use Symfony\Component\HttpFoundation\Request as SymfonyRequest; trait ApiTokenRequestTrait { public function call($method, $uri, $parameters = [], $cookies = [], $files = [], $server = [], $content = null, $headers = []) { $symfonyRequest = SymfonyRequest::create( $uri, $method, $parameters, $cookies, $files, $server, $content ); foreach ($headers as $key => $value) { $symfonyRequest->headers->set($key, $value); } $this->app['request'] = \Laravel\Lumen\Http\Request::createFromBase($symfonyRequest); return TestResponse::fromBaseResponse( $this->app->prepareResponse($this->app->handle($this->app['request'])) ); } }
是說,用 PHPStorm 追 code 爽度真的很不一樣 XD