2017-09-06 8 views
1

Ich habe eine Klasse (FormFilters), diese Klasse ruft ihre Methoden innerhalb einer Methode auf, in diesem Fall getProject.@DataProvider oder @Depends kann ich es verwenden?

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() 
    { 
     //.... 
    } 
} 

Dies ist getProject Methode Test:

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 
} 

Bisher alles in Ordnung. Nun, ich mag getWhere Methode testen, ich könnte es tun, unabhängig, aber wenn getProject den gleichen Test hat (genannt getWhere-Methode), kann ich die Anmerkungen @dataProvider oder @depends verwenden, wie dieses (Beispiel):

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

Es ist möglich?

Antwort

1

In Ihrer aktuellen Konfiguration ist der positive Fall für getWhere() bereits getestet (im Bereich test_getProject()). Also, was zu testen ist in getWhere() ist ein negativer Fall, wenn Interpreter nicht innerhalb von IF geht.

-Test könnte sein:

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(); 
} 

In Bezug auf Ihre Frage mit @depends - es ist in der Regel verwendet, wenn der zweite Test nicht ausgeführt werden kann, vor dem ersten gemacht wird. Beispielsweise erstellt der erste Fall eine Entität in der Datenbank und der zweite Test versucht, die Entität zu löschen, die im vorherigen Test erstellt wurde. Ein anderes Beispiel - eine statische Eigenschaft der Klasse, die in einem Test gesetzt ist und voraussichtlich in einem anderen Test gelesen wird. Abhängige Tests sowie abhängige Code-Einheiten werden generell nicht empfohlen. Und es ist sowieso nicht dein Fall, nicht was du für den Test brauchst.

In Bezug auf @dataProvider - es ist ziemlich nützlich Annotation. Es erlaubt, die Logik des Tests von den getesteten Daten zu trennen. Und es erlaubt auch, denselben Test mit verschiedenen Datensätzen wiederzuverwenden. Der oben angegebene Test mit @dataProvider sieht wie folgt aus:

/** 
* @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, 
     ], 
    ]; 
} 
Verwandte Themen