测试通常由具有phpspec的工厂生成的对象

时间:2016-01-23 03:26:53

标签: php zend-framework2 phpspec

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

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

UITableViewAutomaticDimension

我可以轻松地将我的FooServiceSpec的let函数修改为这样(使用my ZF2 phpspec extension to get the SM):

class FooServiceFactory implements FactoryInterface{

    public function createService( ServiceLocatorInterface $serviceLocator ){

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

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

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

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

尝试避免重复!

谢谢!

1 个答案:

答案 0 :(得分:2)

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

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

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

如果您想测试工厂,请仅测试工厂,而不是服务定位器或FooService