Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用PHPUnit测试此方法调用?_Php_Unit Testing_Testing_Phpunit - Fatal编程技术网

如何使用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,请参阅