2017-09-06 54 views
1

我有一個類(稱爲FormFilters),該類在一種方法中調用其方法,在這種情況下爲getProject@dataProvider或@depends我可以使用它嗎?

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方法測試:

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 
} 

到目前爲止,所有的權利。現在,我想測試getWhere方法,我可以獨立完成,但如果getProject具有相同的測試(叫getWhere方法),我可以使用註釋@dataProvider@depends,像這樣(例如):

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

有可能嗎?

回答

1

在您當前的設置中,getWhere()的正例已經過測試(在test_getProject()的作用域中)。因此,在解釋器不進入IF的情況下,getWhere()中的剩餘測試是否定的情況。

測試可能是:

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, 
     ], 
    ]; 
} 
相關問題