2013-12-20 10 views
5

4.モッキングコールバック私は現在、Laravelにパッケージのテストを書いている

私は、whereメソッドがコールバックを使用している場合を除き、ほぼすべての時間を働くIlluminate\Database\Query\Builderをあざけるています、私はできませんコールバック内のメソッドが呼び出されているかどうかを確認します。

私はあなたのうちの1人が光を放つことを望んでいました。

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

そしてorWhereを呼び出す必要があり、実際のwhere方法。 注:ビルダーモックが下のクラスに渡されます。

$builder = new LaravelBuilder($query); 

これは、次のコードを含む$builder->filter()を呼び出します。それは一度もorWhereを実行しないよう

$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テストは毎回失敗します。あなたが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ドキュメントの第2引数としてクロージャを渡すことについて何も見つけられません。これをどうやって知ったのですか? – alexw

関連する問題