Laravel 仅模拟请求功能和 header

Laravel Mock Request function only and header

我用 PHPUnit 9.0 测试代码。 我使用 Laravel 框架 8.* 和 PHP 7.4

我很难测试使用 request()

的函数

这是我要测试的代码的一个非常简短的版本:

trait SomeTrait
{

  function someFunction()
  {
     //1. retrieve only the documents
     $documents = request()->only('documents');

     ....

     //set an array called $header
     $header = [ 'Accept-Encoding' => 'application/json'];

     //2. add to Array $header if someKey is available in headers
     if (request()->headers->has('someKey'))
     {
       $header = Arr::add($header, 'someKey', request()->header('someKey'));
     }
   }
}

首先 (1.) 它必须从请求中获取文档。我通过请求的模拟解决了这个问题并且它有效:


$requestMock = Mockery::mock(Request::class)
            ->makePartial()
            ->shouldReceive('only')
            ->with('documents')
            ->andReturn($document_data);
        app()->instance('request', $requestMock->getMock());

$this->someFunction();

我创建了一个模拟请求 class,当 request()->only('documents');someFunction() 中被调用时 returns $document_data

但是接着代码request()->headers->has('someKey')returns报错: Call to a member function has() on null

任何人都可以帮助并解释我如何测试代码吗?

感谢您的帮助!我找到了一个没有模拟请求的解决方案 - 有时它比你想象的更容易 :D

//create a request 
$request = new Request();

//replace the empty request with an array
$request->replace(['documents' => $all_documents]);

//replace the empty request header with an array
$request->headers->replace(['someKey' => 'someValue']);

//bind the request
app()->instance('request', $request);