如何使用PHPUnit测试此方法调用?
要测试的代码:如何使用PHPUnit测试此方法调用?,php,unit-testing,testing,phpunit,Php,Unit Testing,Testing,Phpunit,要测试的代码: //将激活提供程序参数添加到工厂定义中 $factoryDefinition=$container->getDefinition('gremo_subscription_factory'); $factoryDefinition->addArgument(新引用($providerId)); 测试方法应检查addArgument方法,包括$providerId参数。我正在学习PHPUnit,现在我只能调用$this->anythis(): $container->expecte
//将激活提供程序参数添加到工厂定义中
$factoryDefinition=$container->getDefinition('gremo_subscription_factory');
$factoryDefinition->addArgument(新引用($providerId));
测试方法应检查addArgument
方法,包括$providerId
参数。我正在学习PHPUnit,现在我只能调用$this->anythis()
:
$container->expected($this->at(3))
->方法('getDefinition')
->带有('gremo\u订阅\u工厂')
->威尔($this->returnValue($factory));
$factory->expects($this->once())
->方法('addArgument')
->使用($this->anythis());
$this->pass->process($container);
如何检查参数类型是
Reference
类,并且(反过来)它的参数正是字符串$providerId
?这相当复杂,特别是因为Reference
类没有注入依赖项,方法调用也没有返回任何内容。不过,我认为你可以用电脑来解决这个问题。下面是我如何做到第二条:
$factory->expects($this->once())
->method('addArgument')
->with($this->logicalAnd(
$this->isInstanceOf('Reference'),
$this->attributeEqualTo('attribute', $providerId)
));
logicalAnd()
中的第二项基本上只是检查创建的Reference
对象,以查看$providerId
是否正确分配(我不确定Reference
构造函数中的$providerId
会发生什么,但我假设它会保存到实例变量或其他东西中)
然而,这类事情正在进入测试
引用
类的实现细节的领域,因此这样的测试对于维护SRP来说并不太好。所有这些都可以通过重构代码来更好地解决。一般来说,如果很难测试,可能不是测试套件的错。如果你不能o,首先考虑改变这方面的内容,而不是编写过于聪明的测试。< / P>新行上的分号非常糟糕。looking@llnk同意…关于这个问题有什么帮助吗?谢谢。不幸的是,这段代码在Symfony 2中很常见,无法避免新的参考
调用。不知道它的缺点是什么tructor将处理我的值,正如您所说的,这无关紧要,因为我必须测试我的代码。我将尝试并报告…构造函数做什么无关紧要,因为您应该模拟整个过程。$this->getMockBuilder('SomeClass')->disableOriginalConstructor()->getMock();@rockstarz:那没用。在这种情况下,模拟引用对象是不可能的,因为它不是依赖注入的。事实上,我认为有一种方法可以避免硬编码引用对象…将它传递到进程()中
方法作为第二个参数。这将使整个过程非常容易测试。@分解器我不直接调用process(),它是框架。而且不能使用attributeEqualTo,请参阅