2012-12-14 33 views
1

代码进行测试:如何使用PHPUnit测试此方法调用?

// Add the activation provider argument to the factory definition 
$factoryDefinition = $container->getDefinition('gremo_subscription_factory'); 
$factoryDefinition->addArgument(new Reference($providerId)); 

试验方法应该检查addArgument方法,包括$providerId说法。我只是learining PHPUnit的和现在我只能打电话给$this->anything()

$container->expects($this->at(3)) 
    ->method('getDefinition') 
    ->with('gremo_subscription_factory') 
    ->will($this->returnValue($factory)); 

$factory->expects($this->once()) 
    ->method('addArgument') 
    ->with($this->anything()); 

$this->pass->process($container); 

我如何检查参数类型为Reference类,以及(反过来)它的参数是完全串$providerId

+0

在新行上的分号看起来相当糟糕 – dynamic

+0

@llnk同意...有关该问题的任何帮助? – gremo

回答

2

这很复杂,尤其是因为Reference类不是依赖注入方法调用不返回任何东西。不过,我认为你可以使用argument constraints解决它。这是我会怎么做,第二句话:

$factory->expects($this->once()) 
    ->method('addArgument') 
    ->with($this->logicalAnd(
     $this->isInstanceOf('Reference'), 
     $this->attributeEqualTo('attribute', $providerId) 
    )); 

logicalAnd()第二项基本上是检查所创建,查看是否$providerId被正确分配(我不知道在发生什么变化$providerIdReference对象构造函数为Reference,但我假设它被保存到实例变量或其他东西)。

然而,这类事情正在进入测试Reference类实现细节的领域,所以像这样的测试对维护SRP并不是很好。所有这些都可以通过重构代码来更好地解决。一般来说,如果很难测试,可能不是测试套件的错。如果你有能力,首先考虑改变事情,而不是写出过于聪明的测试。

+0

谢谢。不幸的是,这段代码在Symfony 2中很常见,并且无法避免新的'Reference'调用。不知道它的构造函数会如何处理我的价值,正如你所说的那样并不重要,因为我必须测试我的代码。我会尽力回报... – gremo

+0

构造函数的作用并不重要,因为你应该嘲笑整个事情。 $ this-> getMockBuilder('SomeClass') - > disableOriginalConstructor() - > getMock(); – jsteinmann

+0

@rockstarz:这没有帮助。在这种情况下,不可能模拟Reference对象,因为它不是依赖注入。 – theunraveler