2017-08-10 2 views
1

Iは、その最初のステップは、直ちにそのパラメータの一つクローンとしてこと、クラス、getPaginatedQueryを有するクローンを方法Builderオブジェクトのテストモックパラメータ

public function getPaginatedQuery(Builder $query, $limit = null, $offset = null) 
{ 
    $constrainedQuery = clone $query; 
    ... 
} 

クローニングその__cloneマジック方法によって達成されます。

私は$queryのためにそれを嘲笑Builderインスタンスを渡すことによって、この方法でユニットテストをしようとしています:

$query = m::mock('Illuminate\Database\Eloquent\Builder'); 
$relation->getPaginatedQuery($query, 2, 1); 

私のテストは、致命的なエラーで失敗します。__clone method called on non-object。私は私の$queryオブジェクトに__cloneの期待を定義しようとしましたが、私は同じエラーを取得する:私はここで間違って何をやっている

$query = m::mock('Illuminate\Database\Eloquent\Builder');   
$clonedQuery = m::mock('Illuminate\Database\Eloquent\Builder'); 
$query->shouldReceive('__clone')->andReturn($clonedQuery); 

$relation->getPaginatedQuery($query, 2, 1); 

答えて

0

Eloquent\Builder実際に(メンバーとして)Query\Builderのインスタンスが含まれており、その魔法__clone方法は、この根本的なQuery\Builderオブジェクトにcloneを呼び出す:あなたはEloquent\Builderをからかっているので、それは実際には持っていません

/** 
* Force a clone of the underlying query builder when cloning. 
* 
* @return void 
*/ 
public function __clone() 
{ 
    $this->query = clone $this->query; 
} 

それはEloquent\Builderのコンストラクタで設定されるため、基礎となる$this->queryのメンバーです。完全にモックされたオブジェクトでは決して呼び出されません。この問題を回避するには

、あなたがEloquent\Builderの部分モックを作成し、Query\Builderの嘲笑インスタンスとrun its real constructorにそれを伝える必要があります:今すぐclone $querygetPaginatedQuery()に呼び出されたときに

$baseQuery = m::mock('Illuminate\Database\Query\Builder'); 
$query = m::mock('Illuminate\Database\Eloquent\Builder', [$baseQuery])->makePartial(); 

$relation->getPaginatedQuery($query, 2, 1); 

、嘲笑Eloquent\Builderインスタンスcloneに電話しての模擬Query\Builderインスタンスを呼び出すことができます。