Php Slim框架unittest模拟路由器

问题描述 投票:0回答:1

我已经在我的应用程序中为Slim请求创建了一个包装器,以便能够在Request对象上创建一些自定义方法。

class Request extends SlimRequest
{
   /**
    * Get authorization token.
    *
    * @return null|string
    */
   public function getAuthToken(): ?string
   {
       return $this->getHeaderLine('FOOBAR-TOKEN');
   }

   /**
    * Retrieves a route parameter.
    *
    * @param string $name
    * @return string|null
    */
   public function getRouteParam(string $name): ?string
   {
       return $this->getRoute()->getArgument($name);
   }

   /**
    * Retrieves the route instance.
    *
    * @return Route
    */
   public function getRoute(): Route
   {
       return $this->getAttribute('route');
   }

}

尝试为这个类创建单元测试时出现问题。我测试请求的方式是在环境模拟中使用Slims构建。第一个函数我在请求中添加了一个头,可以在下面看到,但我无法弄清楚如何将Route对象添加到请求中

$request = Request::createFromEnvironment(Environment::mock());
$request = $request->withHeader('FOOBAR-TOKEN', 'superSafeExampleToken');

我尝试使用请求选项创建请求,但$ this-> getAttribute('route');返回null

   $requestOptions = [
        'REQUEST_METHOD' => 'POST,
        'REQUEST_URI' => '/foo/bar',
        'QUERY_STRING' => http_build_query($requestParameters),
    ];
    $environment = Environment::mock($requestOptions);
php mocking phpunit slim
1个回答
0
投票

好的,所以解决方案如下

public function testGetRouteParam()
{
    $route = $route = new Route('GET', '/foo/{bar}', []);
    $route->setArguments(['bar' => 1]);
    $request = Request::createFromEnvironment(Environment::mock());
    $request = $request->withAttribute('route', $route);

    $this->assertEquals(1, $request->getRouteParam('bar'));
    $this->assertNull($request->getRouteParam('baz'));
}
© www.soinside.com 2019 - 2024. All rights reserved.