symfony phpunit未收到预期值

symfony phpunit未收到预期值,php,phpunit,tdd,symfony,Php,Phpunit,Tdd,Symfony,我试图在Symfony中测试我的服务中的一个简单功能 函数获取post值(如果存在)并设置多维数组。 这是我在服务中的功能: public function setValue(Request $request) { for($i = 1; $i <= 3; $i++){ for($j = 1; $j <= 3; $j++){ if(($request->request->get('cell_'

我试图在Symfony中测试我的服务中的一个简单功能

函数获取post值(如果存在)并设置多维数组。 这是我在服务中的功能:

public function setValue(Request $request)
    {
        for($i = 1; $i <= 3; $i++){
            for($j = 1; $j <= 3; $j++){
                if(($request->request->get('cell_' . $i . '_' . $j) != null){
                    $value = $request->request->get('cell_' . $i . '_' . $j);
                    echo('Value: ' . $value . '|');
                    $this->tiles[$i][$j] = $value;
                }
                else{
                    $this->tiles[$i][$j] = '0';
                }
            }
        }
    }
在这种情况下,理论上我只设置了一个值为1的单元格,但当我转储所有结果时,我得到了这个值

array(3) {
  [1] =>
  array(3) {
    [1] =>
    NULL
    [2] =>
    string(1) "0"
    [3] =>
    string(1) "0"
  }
  [2] =>
  array(3) {
    [1] =>
    string(1) "0"
    [2] =>
    string(1) "0"
    [3] =>
    string(1) "0"
  }
  [3] =>
  array(3) {
    [1] =>
    string(1) "0"
    [2] =>
    string(1) "0"
    [3] =>
    string(1) "0"
  }
}
因为在
cell_1_1
中,我检查了一个空值,但我希望
1
不是空的! 如何返回
1
单元格内的
cell\u 1\u 1
,我的模拟错误是什么


谢谢

您没有填充数组的索引
0

看看你的循环:

...
for($i = 1; $i <= 3; $i++){
    for($j = 1; $j <= 3; $j++){
...

get
返回null的原因是
at()
的索引已经由第一次调用(在if语句中)递增

我发现一些关于它的有用信息具有误导性

您可能根本不想麻烦处理
expects()
at()
,因为它实际上并不反映实际参数包的行为,无论何时调用它,它都会返回相同的参数包

只有当名称为cell_1_1时,才可以使用带有回调的模拟对象返回“1”,如下所示:

$this
  ->requestMock
  ->request
  ->method('get')
  ->will($this->returnCallback(function ($name) {
            return $name === 'cell_1_1' ? '1' : null;
  }));
或者,您也可以使用Symfony请求本身,让您自己变得更加复杂:-)

使用real Request进行测试的示例代码:

    $request = new Request([], ['cell_1_1' => '1']);
    $board = new Board();
    $board->setValue($request);

我试过了,同样的错误,这个解决方案不起作用。第一个if块中缺少的
只是复制过来的一个错误?我试图重新创建这个,这是我注意到的第一件事。是的,对不起,这是复制过来的错误
$this
  ->requestMock
  ->request
  ->method('get')
  ->will($this->returnCallback(function ($name) {
            return $name === 'cell_1_1' ? '1' : null;
  }));
    $request = new Request([], ['cell_1_1' => '1']);
    $board = new Board();
    $board->setValue($request);