Symfony 为什么returnValueMap()返回NULL

Symfony 为什么returnValueMap()返回NULL,symfony,doctrine-orm,phpunit,php-7,Symfony,Doctrine Orm,Phpunit,Php 7,试图在测试中模拟条令存储库,returnValueMap()在与findOneBy方法一起使用时总是返回NULL 我模拟了两个实体,然后尝试使用给定的返回值映射模拟它们的存储库。测试失败,调试显示returnValueMap()返回NULL 这是要测试的类(反规范化器) 它看起来像testDenormalize()中的returnValueMap()的参数需要用括号将其作为索引数组 下面是对以下代码段的稍加修改的版本: 我好不容易调试了PHPUnit库,最后才发现findOneBy()方法需要两

试图在测试中模拟条令存储库,returnValueMap()在与findOneBy方法一起使用时总是返回NULL

我模拟了两个实体,然后尝试使用给定的返回值映射模拟它们的存储库。测试失败,调试显示returnValueMap()返回NULL

这是要测试的类(反规范化器)


它看起来像
testDenormalize()
中的
returnValueMap()
的参数需要用括号将其作为索引数组

下面是对以下代码段的稍加修改的版本:


我好不容易调试了PHPUnit库,最后才发现findOneBy()方法需要两个参数,其中第二个参数是可选的(设置为null)

willReturnMap()方法如下所示:

/**
*通过从映射返回值来存根方法。
*/
类ReturnValueMap实现存根
{
/**
*@var数组
*/
私人$valueMap;
公共函数构造(数组$valueMap)
{
$this->valueMap=$valueMap;
}
公共函数调用(调用$Invocation)
{
$parameterCount=\count($invocation->getParameters());
foreach($this->valueMap作为$map){
if(!\is_数组($map)|$parameterCount!==(\count($map)-1)){
继续;
}
$return=\array\u pop($map);
如果($invocation->getParameters()==$map){
return$return;
}
}
返回;
}
我怀疑该方法总是返回null,因为未满足条件
$parameterCount!==(\count($map)-1)
。 一个断点证实了我的怀疑,还显示
$invocation->getParameters()
转储如下:

数组(2){
[0] =>
阵列(1){
“名称”=>
弦(5)“曼_1”
}
[1] =>
无效的
}
因此,我必须明确地传递
null
作为第二个参数。 因此,最终工作图必须是:

$this->additionalServicesRepoMock
->方法('findOneBy')
->willReturnMap([
[['name'=>'man_1'],空,$manOneService],
[['name'=>'recycling'],null,$recyclingService],
]);

我尝试了这个解决方案,但没有成功。实际上,findOneBy()方法将关联数组作为参数,而不是索引数组。我的意思是
returnValueMap()
应该采用索引数组。尽管我已经确认
公共函数doSomething($parameterA,$parameterB=null)
也会破坏
testReturnValueMapWithIndexedArray()
。我必须说,这不是超直观的。假设
findOneBy()
是来自学说。
<?php

namespace App\Tests;

use PHPUnit\Framework\TestCase;

class ReturnValueMapTest extends TestCase
{
    public function testReturnValueMapWithAssociativeArray()
    {
        $stub = $this->createMock(SomeClass::class);

        $map = [
            [
                'name' => ['man_1'],
                'Hello'
            ],
        ];

        $stub->method('doSomething')
            ->will($this->returnValueMap($map));

        // This will fail as doSomething() returns null
        $this->assertSame('Hello', $stub->doSomething(['name' => ['man_1']]));
    }

    public function testReturnValueMapWithIndexedArray()
    {
        $stub = $this->createMock(SomeClass::class);

        $map = [
            [
                ['name' => ['man_1']], // Notice the difference
                'Hello'
            ],
        ];

        $stub->method('doSomething')
            ->will($this->returnValueMap($map));

        $this->assertSame('Hello', $stub->doSomething(['name' => ['man_1']]));
    }
}

class SomeClass
{
    public function doSomething()
    {}
}