如何使用PHPUnit测试此方法调用?

时间:2012-12-14 01:30:43

标签: php unit-testing testing phpunit

要测试的代码:

// 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

1 个答案:

答案 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并不好。通过重构代码可以更好地解决所有这些问题。一般来说,如果很难测试,可能不是测试套件的错。如果你能够,可以考虑先改变一切,而不是写一些过于聪明的测试。