在phpspec中使用let



我正在尝试在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手册上看到了一个对象构造的示例,它使用Writer对象传递给构造函数。但是,它不解释如何创建此编写器对象。

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

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

但它没有解释 Writer 对象本身是如何构造的。服务管理器将如何构建?

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

您可以在此处阅读更多内容

更准确地说,$writer$serviceManager测试双精度

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

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

相关内容

  • 没有找到相关文章

最新更新