测试通常由工厂使用 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
。
您如何着手实施可以利用您的工厂来创建测试对象的测试?
例如,假设您有一个像这样的 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
。