1

要测试的代码:

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

4

1 回答 1

2

这非常复杂,特别是因为Reference该类不是依赖注入并且方法调用不返回任何内容。但是,我认为您可以使用参数约束来解决它。这是我将如何执行第二个子句:

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

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

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

于 2012-12-14T02:58:15.477 回答