2017-09-22 2 views
0

내 컨트롤러에서 PHPUnit을하고있어 요청 권한을 조롱 한 것처럼 보일 수 없습니다.Laravel PHPUnit mock 요청

단위 테스트에 그런
use Illuminate\Http\Request; 

public function insert(Request $request) 
{ 
    // ... some codes here 
    if ($request->has('username')) { 
     $userEmail = $request->get('username'); 
    } else if ($request->has('email')) { 
     $userEmail = $request->get('email'); 
    } 
    // ... some codes here 
} 

,

public function testIndex() 
{ 
    // ... some codes here 

    $requestParams = [ 
     'username' => 'test', 
     'email' => '[email protected]' 
    ]; 

    $request = $this->getMockBuilder('Illuminate\Http\Request') 
     ->disableOriginalConstructor() 
     ->setMethods(['getMethod', 'retrieveItem', 'getRealMethod', 'all', 'getInputSource', 'get', 'has']) 
     ->getMock(); 

    $request->expects($this->any()) 
     ->method('get') 
     ->willReturn($requestParams); 

    $request->expects($this->any()) 
     ->method('has') 
     ->willReturn($requestParams); 

    $request->expects($this->any()) 
     ->method('all') 
     ->willReturn($requestParams); 

    // ... some codes here 
} 

여기서 문제는 내가 그것을 var_dump($request->has('username'); 그 어느 때 항상 전체 배열하는 $requestParams 값을 반환한다는 것입니다 :

여기 컨트롤러입니다. 배열에 사용자 이름 키가 존재하므로 true을 반환해야합니다. 나는 $requestParams에 사용자 이름의 키를 삭제할 때 내가 볼 수있는 지금까지 배열

답변

1

username 키를 포함하고 당신이 당신의 단위 테스트를 말하는거야 이해하지 않는 한

다음에, false를 돌려 그 요청 객체에서 $ request-> has()를 호출하면 true 또는 false가 아닌 $ requestParams 배열을 반환해야합니다.

모의 전화로 보내지는 것이 무엇인지 구체적으로 확인하지 않는 한, 모의은 실제로 어떤 것이 전송되는지는 신경 쓰지 않습니다.

비어있는 요청을 작성하고 가능한 경우 데이터로 채우기를 시도해 볼 수 있습니다. 유스 케이스에서 가능하다면 단위 테스트를 더 쉽고 적은 이슈로 실행할 수 있습니다. 이것은 모든 경우에 적용되지는 않습니다.

당신이 단행 테스트에서 만들 어서 어설 션을 포함시킬 수 있으므로, 현재 실행중인 것을보다 분명하게 볼 수 있습니다. 그것은 당신이 그것을 반환하라는 것을 정확히 반환합니다. 비록 그것이 당신이 실제로 그것을 돌려주고 싶지 않은 것이라 할지라도.

모의 테스트는 유닛 테스트를 나머지 시스템과 분리하는 데 사용됩니다. 따라서 일반적으로 조롱 한 클래스에 코드가 실제로 종료되었는지 여부와 예상 데이터가있는 경우에만 특정 메소드가 호출되는지 확인하는 경향이 있습니다. 극단적 인 경우에는 실제로 테스트하고있는 시스템을 조롱 할 수는 있지만 일반적으로 코드가 다른 클래스에 너무 많이 의존하거나 너무 많이 수행하고 있음을 나타냅니다.

mock을 사용하는 또 다른 이유는 메서드 호출에서 형식 변환을 만족시키는 것입니다. 이 경우 일반적으로 비웃음 객체를 만들고 코드에서 테스트하거나 코드에서 테스트 할 더미 데이터를 채 웁니다.

당신의 경우에는 코드가 실제로 올바르게 작동하는지 확인하고 싶습니다. 요청을 조롱하지 않거나 true를 반환하도록 특정 테스트를 수행하거나 false (둘 다 테스트합니다. 경우)

그래서의 라인을 따라 뭔가 :

$request->expects($this->any()) 
    ->method('has') 
    ->with('username') 
    ->willReturn(true); // or false in your next test 

편집 : 당신이 코드에서 방법을 여러 번이 사용하고 그 문제로 실행 다음은 주석에서 언급 한 바와 같이 및 실행 문제로.

내 답변에 링크 된 질문은 더 자세히 설명되어 있지만 요약하면 여러 가지 경우를 다루기 위해 인라인 함수 또는 at() 메서드를 사용할 수 있습니다.

at()를 사용하면 코드의 특정 반복을 제공하여 해당 비트 만 테스트 할 수 있습니다.이전 테스트가 테스트를 중단하기 전에 테스트를 추가하기 때문에 테스트가 다소 번거롭다는 언급이있었습니다.

$request->expects($this->at(0)) 
    ->method('has') 
    ->with('username') 
    ->willReturn('returnValue'); 

$request->expects($this->at(1)) 
    ->method('has') 
    ->with('email') 
    ->willReturn('otherReturnValue'); 

인라인 함수 (콜백) 솔루션은 여러 경우를 허용하도록 검사를 사용자 정의하고, 필요에 따라 데이터를 반환 할 수있다. 불행히도 나는 전에이 개념을 사용하지 않았기 때문에이 개념에 익숙하지 않다. 이에 대한 자세한 내용은 PHPUnit docs을 읽어 보시기 바랍니다.

결국 나는 요청을 조롱하지 말고 대신 빈 데이터 요청을 작성하여 확인하려는 데이터를 채울 것을 제안합니다. Laravel에는 몇 가지 인상적인 방법이 제공되므로 대개 테스트 할 데이터가 많은 요청을 수동으로 채울 수 있습니다.

예를 들어, 당신은 내가 당신이 위해서 var_dump를 사용하는 것 같다 언급하고 싶은 지난 몇 포인터로

request->add(['fieldname' => 'value']) 

를 사용하여 데이터 (포스트/얻을 데이터)를 추가 할 수 있습니다. Laravel은 디버깅과 비슷하고 매우 유용한 두 가지 기능을 제공합니다. dump();은 덤프를 결정하고 코드 실행을 중지하며 dump();은 사용자가 결정한 내용 만 출력하므로 dd(); 또는 dump(); dd();을 사용할 수 있습니다. dd($request); 또는 dump($request);을 수행하고 변수/클래스 객체/etc가 무엇을 가지고 있는지 확인할 수 있습니다. 심지어 일부 자바 스크립트 등으로 구성되어 있기 때문에 레이아웃에 무엇이 있는지 볼 수 있습니다. 그것이 존재하는지 몰랐다면 그것을 확인하고 싶을 수도 있습니다.

+0

감사합니다. @Tropus. '$ request-> has ('username')'은 이제'true'를 반환하지만'$ request-> has ('email')'은 다음과 같은 오류를 반환합니다 :'메소드 이름에 대한 기대가 실패했습니다 : 0 번 이상 호출 됨 호출에 대한 매개 변수 0 Illuminate \ Http \ Request :: has ('email')가 예상 값과 일치하지 않습니다. 두 개의 문자열이 같다고 주장하지 못했습니다 .'. 나는 당신이 진술 한 것과 똑같이'email'을위한 또 다른 스 니펫을 추가했으나 여전히 오류가 발생했습니다. – basagabi

+0

@basagabi 특정 방법이 예상되는 첫 번째 사례는 두 번째로 호출 할 때 정의 된 첫 번째 시간까지 연기됩니다. 이 경우에는 with 문에서 콜백을 사용하거나 any() 대신 at()를 사용하고 싶을 것입니다. 예를 들면 : 첫 번째 경우에는'expects ($ this-> at (0))' 두 번째 발생을 위해 ($ this-> at (1))'을 기대합니다. 이러한 우수한 답변들에 대한 자세한 내용은 [여기] (https://stackoverflow.com/a/5989095) 및 [여기] (https://stackoverflow.com/a/5484864/6649665) – Tropus

+0

완벽하게 작동합니다! 너는 생명의 은인이야! – basagabi

관련 문제