2017-02-18 1 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 내부에 있기 때문에 내가 얻을 0은 비어 있지 않습니다! cell_1_1 안에 1을 어떻게 반환 할 수 있습니까? 내 모의의 오류는 무엇입니까?

감사

+0

는 이상 복사에서 누락 된')'최초의 블록의 경우 단지 오류인가? 나는 이것을 재현하려고 노력했는데 이것이 내가 알아 차린 첫 번째 일이었다. – mickadoo

+0

네, 죄송합니다. –

답변

1

get가 null 반환되는 이유입니다.

오해의 소지가 있다는 것에 대해 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; 
    })); 

아니면 그냥 심포니 요청 자체를 사용할 수있는 자신의 많은 같은 실제 요청을 사용하여 테스트를위한

샘플 코드 :-) 합병증 :

$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을 변경해야합니다. at()에 대한 인덱스가 이미합니다 (if 문에서) 첫 번째 호출에 의해 증가 되었기 때문에

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

을 복사하는 중 오류가 발생했습니다. 같은 오류가 발생했습니다.이 solutiuon이 작동하지 않습니다. –

관련 문제