如何在PhpSpec中访问Laravel Controller的静态属性?

时间:2016-08-01 16:50:35

标签: php unit-testing laravel phpspec

我正在尝试编写一个类,它将读取由它构造的构造函数给出的路由。然而,即使在谷歌搜索1小时后,我也没有找到任何方法来访问Laravel控制器的getRouter方法 - 因为it's a static function。 我尝试了很多东西,但大部分时间我都遇到了错误:

  

未捕获错误:在不在对象上下文中时使用$ this   vendor / phpspec / prophecy / src / Prophecy / Doubler / Generator / ClassCreator.php(49):
  eval()' d代码:13
  堆栈跟踪:    #0 [内部函数]:Double \ Illuminate \ Routing \ Controller \ P4 :: getRouter()

我如何实现这一目标,或者PhpSpec无法实现这一目标?

我的规格:

use Illuminate\Routing\Controller;
use PhpSpec\ObjectBehavior;
use Prophecy\Argument;

class OptionDescriberSpec extends ObjectBehavior
{

    function let(Controller $controller)
    {
      $this->beConstructedWith($controller);
    }

    function it_should_read_the_aviable_routes_of_the_controller()
    {
        $this->getController()->getRouter()->shouldReturn('Router');
        $this->render()->shouldReturn('Router');
    }
}

我的班级:

use Illuminate\Routing\Controller;

class OptionDescriber
{

    /**
     * @var Controller
     */
    protected $controller;

    /**
     * OptionDescriber constructor.
     *
     * @param Controller $controller
     */
    public function __construct(Controller $controller)
    {
        $this->controller = $controller;
    }

    public function render()
    {
        return $this->controller->getRouter();
    }
}

1 个答案:

答案 0 :(得分:0)

function it_should_read_the_aviable_routes_of_the_controller(Controller $controller, Router $router)
{
    $this->getController()->willReturn($controller);
    $controller->getRouter()->willReturn($router);

    $this->render()->shouldReturn($router);
}

尽管不建议使用规格控制器。让控制器尽可能薄,然后移动“肉”。进入控制器使用的服务。