2013-12-20 130 views
5

我目前在Laravel編寫測試的封裝體4嘲諷回調

我嘲笑它的工作原理幾乎所有的時間除了當一個where方法使用一個回調Illuminate\Database\Query\Builder,我不能檢查回調中的方法是否被調用。

我希望你們中的一個能夠發出一些光。

$query = \Mockery::mock('Illuminate\Database\Query\Builder', function ($mock) { 
    /** @var \Mockery\Mock $mock */ 
    $mock->shouldReceive('where'); 
    $mock->shouldReceive('orWhere')->twice(); 
}); 

和實際where方法應該調用orWhere注意:該構建器模擬被傳遞給下面的類。

$builder = new LaravelBuilder($query); 

然後調用$builder->filter()其中包含以下代碼。

$this->query->where(function ($query) use ($filterData) { 
    /** @var \Illuminate\Database\Query\Builder|\Illuminate\Database\Eloquent\Builder $query */ 
    foreach($filterData['columns'] as $colData) { 
     /** @var \Samvaughton\Ldt\Column $column */ 
     $column = $colData['column']; 

     // See if this column is searchable 
     if (!$column->isSearchable() || !$colData['searchable']) continue; 

     // If the individual column term is empty, use the main term 
     $term = (empty($colData['term'])) ? $filterData['term'] : $colData['term']; 

     // Actually apply the filter 
     $query->orWhere($column->getSqlColumn(), "LIKE", "%{$term}%"); 
    } 
}); 

主要部分是底位$query->orWhere,PHPUnit的測試失敗每一次,因爲它不運行orWhere甚至一度。由於continue,在你說它可能沒有達到它的執行之前,我傳遞的數據將允許這樣做。

我懷疑這是由於我如何嘲笑where方法。如果我在foreach之前包含exit,它將不會執行,表明它甚至不在回調中運行任何內容。我知道這是默認行爲,但我如何讓Mockery運行相同/類似的回調?

我已經嘗試使用部分模擬,使用shouldExpect,但不完全理解它。我也嘗試過在這種情況下搜索,但沒有運氣。

如果我能夠學習如何在回調中使用嘲諷,那將會很棒。

回答

3

好的,所以我認爲這可以做更好的方法,但我訴諸部分嘲諷Laravel的查詢構建器。在Illuminate\Database\Query\Builder

見線324當使用封閉Laravel產生一個新的查詢生成器也需要被嘲笑。下面是工作代碼:

$query = \Mockery::mock('Illuminate\Database\Query\Builder', function ($mock) { 
    /** @var \Mockery\Mock $mock */ 
    $mock->makePartial(); 
    $mock->shouldReceive('where')->once()->passthru(); 
    $mock->shouldReceive('newQuery')->andReturn(
     \Mockery::mock('Illuminate\Database\Query\Builder', function ($mock) { 
      /** @var \Mockery\Mock $mock */ 
      $mock->makePartial(); 
      $mock->shouldReceive('orWhere')->twice(); 
     }) 
    ); 
}); 

我需要使用makePartial()所以查詢生成器保留了原有的功能,閉包(這是不正確的單元測試),所以這不是最好的解決辦法。從這裏我嘲笑newQuery方法被調用產生一個新的查詢生成器實例,然後我用類似的格式嘲笑。

+0

這真的幫助了我!在Mockery文檔中,我無法找到任何關於將閉包作爲第二個參數傳遞給'mock'的東西。你怎麼知道這樣做? – alexw