如何实施可以利用工厂创建测试对象的测试?
例如,假设你有一个像这样的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 );
}
尝试避免重复!
谢谢!
答案 0 :(得分:2)
如果您正在测试FooService
对象,则应该只测试FooService
对象并模拟其他所有内容(您不应该使用规范中的任何服务定位器单元):
class FooServiceSpec extends ObjectBehaviour
{
function let(Bar $bar)
{
$this->beConstructedWith($bar);
}
function it_xxx()
{
// ...
}
}
如果您想测试工厂,请仅测试工厂,而不是服务定位器或FooService
。