【问题标题】:Using let in phpspec在 phpspec 中使用 let
【发布时间】:2015-04-29 02:13:40
【问题描述】:

我正在尝试在 phpspec 中测试一个类。该类是在 ZF2 中使用的常规服务类。

class GuestService implements ServiceLocatorAwareInterface
{
    public static function createWithServiceManager(ServiceLocatorInterface $serviceLocator)
    {
        $guestService = new GuestService();
        $guestService->setServiceLocator($serviceLocator);
        return $guestService;
    }

    public function setServiceLocator(ServiceLocatorInterface  $serviceLocator)
    {
        $this->services = $serviceLocator;
    } 
}

我的规格是:

class GuestServiceSpec extends ObjectBehavior
{
    function let(ServiceLocatorInterface $serviceManager)
    {
        $this->beConstructedThrough('createWithServiceManager' , [$serviceManager]);
    }
}

我很难理解 phpspec 将如何首先创建 serviceManager 对象来调用构造函数。在 Zend 中,我有一个工厂闭包,它允许构造与上面给出的静态方法非常相似。

我在phpspec manual 上看到了一个对象构造示例,它使用 Writer 对象传递给构造函数。然而,它没有解释这个 Writer 对象是如何创建的。

我可以在该页面上看到将对象传递给 phpspec 函数的类似示例。

function it_does_something_if_argument_is_false(Writer $writer)
{
    $this->beConstructedWith($writer, false);
    // constructed with second argument set to false
    // ...
}

但它并没有解释 Writer 对象本身是如何构造的。 serviceManager 将如何构建?

【问题讨论】:

    标签: zend-framework zend-framework2 phpspec


    【解决方案1】:

    在您的情况下,$writer$serviceManager存根。 PHPSpec 解析方法中的类型提示(WriterServiceLocatorInterface)并使用反射创建存根。只有原始类的副本具有复制的方法,但没有实现。

    您可以阅读更多here

    【讨论】:

      【解决方案2】:

      更准确地说,$writer$serviceManager测试替身

      如果您的测试不依赖于$serviceManager 中的任何方法,PHPSpec 将创建一个 dummy - 一个没有任何行为的空对象。

      您可以从 Konstantin (@everzet) 演示文稿中了解有关测试替身的更多信息: https://youtu.be/X6y-OyMPqfw?t=12m0s

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-11-17
        • 2014-08-20
        • 1970-01-01
        • 2014-08-17
        • 1970-01-01
        • 1970-01-01
        • 2018-09-16
        相关资源
        最近更新 更多