【问题标题】:How to get Mockery to work with a demeter chain如何让 Mockery 与 demeter 链一起工作
【发布时间】:2014-03-21 13:53:18
【问题描述】:

我有一个带有一些中间件的 Slim 应用程序。

它对路由进行身份验证,并像这样检索路由:

$route = $this->getApplication()->router()->getCurrentRoute();

我现在正在对其进行测试,并尝试使用 Mockery 来模拟链式调用的结果,这样我就可以有效地指定路由。

$mock = M::mock('\Api\SessionMiddleware[getApplication]');
$mock->shouldReceive('router->getCurrentRoute')->andReturn('myRoute');

这不起作用。它尝试调用:require('lib/demeter/router.php') 并失败,因为它不存在。

我也试过了:

$mock = M::mock('\Api\SessionMiddleware')->shouldDeferMissing();
$mock->shouldReceive('getApplication->router->getCurrentRoute')->andReturn('myRoute');

这也不起作用,失败:

Failed opening required 'lib/demeter/getApplication.php'

我错过了什么?

【问题讨论】:

    标签: php mockery


    【解决方案1】:

    即使有一个公认的答案,我也想为未来的用户提供另一种解决方案。

    如果路由器仅用作 demeter 链的中间步骤,则无需模拟路由器。试试这个:

    $mock = M::mock('\Api\SessionMiddleware');
    $mock->shouldReceive('getApplication->router->getCurrentRoute')->andReturn('myRoute');
    

    关键是删除对shouldDeferMissing()的调用,在这种情况下,这似乎会干扰demeter链。

    这样,返回一个“纯”模拟,它不会将任何内容转发给SessionMiddleware 的实际实现。当调用$mock->getApplication()->getRouter()->getCurrentRoute() 时,它应该能够回复'myRoute'

    【讨论】:

      【解决方案2】:

      您还需要模拟路由器。并让router()方法依次返回router mock。

      $mock = M::mock('\Api\SessionMiddleware[getApplication]');
      $routerMock = M::mock('My\Router');
      $routerMock->shouldReceive('getCurrentRoute')->andReturn('myRoute');
      $mock->shouldReceive('router')->andReturn($routerMock);
      

      【讨论】:

        猜你喜欢
        • 2023-02-02
        • 2017-06-25
        • 2020-12-13
        • 2012-02-02
        • 2011-02-22
        • 2013-03-24
        • 2016-07-22
        • 2011-08-17
        • 2021-12-18
        相关资源
        最近更新 更多