2017-09-06 4 views
1

클래스 (FormFilters)가 있는데이 클래스는 하나의 메서드 내에서 메서드를 호출합니다.이 경우 getProject입니다.@dataProvider 또는 @depends를 사용할 수 있습니까?

public function test_getProject() 
{ 
    $formInterface = $this->createMock('Symfony\Component\Form\FormInterface'); 

    $formInterface 
     ->expects($this->at(0)) 
     ->method('isValid') 
     ->willReturn(true); // come into conditional 

    $formInterface 
     ->expects($this->at(1)) 
     ->method('get') 
     ->with('name') 
     ->will($this->returnSelf()); 

    $formInterface 
     ->expects($this->at(2)) 
     ->method('getData') 
     ->will('data example'); 

    $formFilters = new FormFilters(); 
    $formFilters->getProject($formInterface); // my mock 
} 

지금까지 모든 권리 :

class FormFilters extends KernelTestCase 
{ 
    public function getProject($filters) 
    { 
     $this->filters = $filters; 
     $this->getWhere($this->filters); 
    } 

    public function getWhere() 
    { 
     if ($this->filters->isValid()) { 
      $this->sql = $this->filterName($this->filters->get('name')->getData()); 
     } 
    } 

    public function filterName() 
    { 
     //.... 
    } 
} 

getProject 방법의 테스트입니다. 나는이 (예)처럼, 주석 @dataProvider 또는 @depends를 사용할 수 있습니다, 지금, getWhere 방법을 테스트 할, 내가 독립적으로 그것을 할 수 있지만 getProject이 동일한 테스트가있는 경우 (getWhere 방법에 부름) :

/** 
* @depends or/and @dataProvider test_getProject 
*/ 
public function test_getWhere($dataToDepends) 
{ 
    // ... test ready ! 
} 

가능합니까?

답변

1

현재 설정에서 getWhere()에 대한 양수 값은 이미 test_getProject()의 범위에서 테스트되었습니다. 따라서 getWhere()에서을 테스트 할 수 있도록 남아있는 것은 인터프리터가 IF 내부로 가지 않는 경우의 음수입니다.

테스트 될 수있다 :

public function test_getWhere_invalid_filters() 
{ 
    $formInterface->expects($this->once()) 
        ->method('isValid') 
        ->willReturn(false); 
    $formInterface->expects($this->never()) 
        ->method('get'); 
    $formInterface->expects($this->never()) 
        ->method('getData'); 

    $formFilters = new FormFilters(); 
    //todo: inject $formInterface into $formFilterssomehow at this line. 

    $formFilters->getWhere(); 
} 

@depends와 귀하의 질문에 대해서 - 처음이 완료되기 전에 두 번째 테스트를 실행할 수 없습니다 때 일반적으로 사용됩니다. 예를 들어, 첫 번째 경우는 데이터베이스에 일부 엔터티를 만들고 두 번째 테스트는 이전 테스트에서 만든 엔터티를 삭제하려고 시도합니다. 또 다른 예 - 한 테스트에서 설정되어 다른 테스트에서 읽힐 것으로 예상되는 클래스의 정적 속성입니다. 일반적으로 종속 테스트를 비롯하여 종속 코드 단위는 권장되지 않습니다. 그리고 어쨌든, 그것은 당신이 아니라 테스트에 필요한 것입니다.

관련하여 @dataProvider - 매우 유용한 주석입니다. 테스트 된 로직과 테스트 된 로직을 분리 할 수 ​​있습니다. 또한 다른 데이터 세트로 동일한 테스트를 재사용 할 수 있습니다. 위에 게시 된 @dataProvider 테스트는 다음과 같이 표시됩니다.

/** 
* @dataProvider getWhere_invalid_filters_data_provider 
*/ 
public function test_getWhere_invalid_filters($isValid, $getCallsCount, $getDataCallsCount) 
{ 
    $formInterface->expects($this->once()) 
        ->method('isValid') 
        ->willReturn($isValid); 
    $formInterface->expects($this->exactly($getCallsCount)) 
        ->method('get'); 
    $formInterface->expects($this->exactly($getDataCallsCount)) 
        ->method('getData'); 

    $formFilters = new FormFilters(); 
    //todo: inject $formInterface into $formFilterssomehow at this line. 

    $formFilters->getWhere(); 
} 

public function getWhere_invalid_filters_data_provider() 
{ 
    return [ 
     'case 1' => [ 
      'isValid' => false, 
      'getCallsCount' => 0, 
      'getDataCallsCount' => 0, 
     ], 
    ]; 
}