【问题标题】:Php Slim framework unittest mock Routerphp Slim 框架单元测试模拟路由器
【发布时间】:2019-09-15 01:01:57
【问题描述】:

我在我的应用程序中为 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 build in environment mocks。第一个函数我在请求中添加了一个标头,如下所示,但我不知道如何将 Route 对象添加到请求中

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

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

   $requestOptions = [
        'REQUEST_METHOD' => 'POST,
        'REQUEST_URI' => '/foo/bar',
        'QUERY_STRING' => http_build_query($requestParameters),
    ];
    $environment = Environment::mock($requestOptions);

【问题讨论】:

  • 不确定创建 Route 对象是什么意思 - 这应该是您应用的路由中的设置,而不是请求中的设置。
  • 我知道创建应用程序时会发生什么,然后我就可以访问路由对象。 slimframework.com/docs/v3/objects/request.html#route-object 我只是不知道如何设置它,所以我可以在单元测试中使用它
  • 您的路由对象在开始处理请求后就设置好了,所以在您执行$app->run(); 之后,这将调用您为请求定义的任何路由。一旦你处理了这个请求,就应该设置它。
  • 如果我必须启动整个应用程序来执行它,测试就不会那么孤立。我将尝试创建一个 Route 类,然后使用 $request = $request->withAttribute('route', $route) 将其作为属性添加到请求中,看看我是否可以完成这项工作
  • 你可以看看这个 Slim 3 example

标签: php mocking phpunit slim


【解决方案1】:

好的,所以解决方案如下

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'));
}

【讨论】:

  • 谢谢,这很有帮助
猜你喜欢
  • 2013-07-16
  • 1970-01-01
  • 2015-04-30
  • 2017-10-13
  • 1970-01-01
  • 1970-01-01
  • 2020-03-19
  • 2019-07-30
  • 2018-03-08
相关资源
最近更新 更多