要测试的代码:
// Add the activation provider argument to the factory definition
$factoryDefinition = $container->getDefinition('gremo_subscription_factory');
$factoryDefinition->addArgument(new Reference($providerId));
测试方法应检查addArgument
方法,包括$providerId
参数。我刚学习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 :(得分:2)
这非常复杂,特别是因为Reference
类没有依赖注入,并且方法调用不返回任何内容。但是,我认为你可以使用argument constraints解决它。这是我如何做第二个条款:
$factory->expects($this->once())
->method('addArgument')
->with($this->logicalAnd(
$this->isInstanceOf('Reference'),
$this->attributeEqualTo('attribute', $providerId)
));
logicalAnd()
中的第二项基本上只是检查创建的Reference
对象,以查看是否正确分配了$providerId
(我不确定{{1}会发生什么在$providerId
构造函数中,但我假设它被保存到实例变量或其他东西。)
然而,这类事情正在进入测试Reference
类的实现细节的领域,因此这样的测试对于维护SRP并不好。通过重构代码可以更好地解决所有这些问题。一般来说,如果很难测试,可能不是测试套件的错。如果你能够,可以考虑先改变一切,而不是写一些过于聪明的测试。