簡體   English   中英

在Laravel 4(Mockery)中嘲笑回調

[英]Mocking callbacks in Laravel 4 (Mockery)

我正在為Laravel 4中的包編寫測試。

我嘲笑Illuminate\\Database\\Query\\Builder幾乎一直都在工作,除非where方法使用回調,我無法檢查回調中的方法是否被調用。

我希望你們中的一個人可以解決一些問題。

$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 ,使用shouldExpect但不完全理解它。 我也試過四處尋找,但這種情況沒有運氣。

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

好的,所以我認為這可以用更好的方式完成,但我使用了部分模擬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方法,該方法被調用以生成一個新的查詢構建器實例,然后我以類似的格式進行模擬。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM