测试通常由工厂使用 phpspec 生成的对象

Testing objects that are usually generated by factories with phpspec

您如何着手实施可以利用您的工厂来创建测试对象的测试?

例如,假设您有一个像这样的 Zend Framework 2 工厂:

class FooServiceFactory implements FactoryInterface{

    public function createService( ServiceLocatorInterface $serviceLocator ){

        $bar = new Bar($serviceLocator->get('config'));
        return new FooService( $bar );
    }
}

我可以很容易地将 FooServiceSpec 的 let 函数修改为如下所示(使用 my ZF2 phpspec extension to get the SM):

function let(){
    $bar = new Bar($this->getServiceLocator()->get('config'));
    $this->beConstructedWith( $bar );
}

但是,我这样做并不是在测试我的工厂。我当然可以编写单独的测试来测试工厂本身,但这是重复的工作。

有没有办法将对象实例化完全推迟到自定义例程?这样在我的测试中,我可以做到(虚构):

function letBetter(){
    return $this->getServiceLocator()->get(FooService::class);
}

尽量避免重复!

谢谢!!

如果您正在测试 FooService 对象,您应该只测试 FooService 对象并模拟其他所有对象(您不应使用规范中的任何服务定位器单元):

class FooServiceSpec extends ObjectBehaviour
{
    function let(Bar $bar)
    {
        $this->beConstructedWith($bar);
    }

    function it_xxx()
    {
        // ...
    }
}

如果你想测试工厂,只测试工厂而不是服务定位器或FooService