2017-02-18 72 views
1

我想在Symfony中的服務中測試一個簡單的函數。symfony phpunit沒有收到期望的值

該函數獲取帖子值,如果存在並設置一個多維數組。 這是我的一個服務裏面功能:

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'; 
       } 
      } 
     } 
    } 

這是我測試的一部分(不是所有的測試,但一個簡單的一部分)

public function testGetSatusGameEnd() 
{ 
    $this->requestMock = $this 
     ->getMockBuilder('Symfony\Component\HttpFoundation\Request') 
     ->disableOriginalConstructor() 
     ->getMock(); 

    $this->requestMock->request = $this 
     ->getMockBuilder('Symfony\Component\HttpFoundation\ParameterBag') 
     ->disableOriginalConstructor() 
     ->getMock(); 

    $this->requestMock->request->expects($this->at(0)) 
     ->method('get') 
     ->with('cell_1_1') 
     ->will($this->returnValue('1')); 

    $board = new Board(); 
    $board->setValue($this->requestMock); 

    var_dump($board->getArrayResult()); 
} 

在這種情況下,我只設置了電池在理論上與值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_1_1,我的模擬的錯誤是什麼?

感謝

+0

是缺少')'第一,如果塊只是抄襲了錯誤?我試圖重新創建這個,這是我注意到的第一件事。 – mickadoo

+0

對不起,這是從 –

回答

1

原因get被返回null是因爲at()指數已經由第一次調用遞增(if語句)。

我在this article上發現了一些有關誤導性的信息。

您可能根本不想打擾expects()at(),因爲它並不真正反映實際參數包的行爲,不管何時它被調用都會返回相同的行爲。

你可以使用模擬對象有回調返回「1」只有當名字是cell_1_1,就像這樣:

$this 
    ->requestMock 
    ->request 
    ->method('get') 
    ->will($this->returnCallback(function ($name) { 
      return $name === 'cell_1_1' ? '1' : null; 
    })); 

或者你可以只使用Symfony的請求本身和同自己很多的併發症:-)

示例代碼使用真實請求測試:

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

這個解決方案工作正常!謝謝 –

0

你不灌裝數組的索引0

在你的循環請看:

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

無論是從,而不是指數0指數1開始。這樣,第一個數組元素將永遠不會被設置,這就是爲什麼它是null

您必須以這種方式更改for

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

複製出錯我試過了,同樣的錯誤,這個solutiuon不起作用 –