我目前在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
,但不完全理解它。我也嘗試過在這種情況下搜索,但沒有運氣。
如果我能夠學習如何在回調中使用嘲諷,那將會很棒。
這真的幫助了我!在Mockery文檔中,我無法找到任何關於將閉包作爲第二個參數傳遞給'mock'的東西。你怎麼知道這樣做? – alexw