2016-10-20 18 views
3

私はデータベース呼び出しを行うクラスmyModelがあります。そのように私はこれをスタブしたいので、実際にはこれらの高価な呼び出しのいずれかをしません。模擬を使用して同じクラスのインスタンスを模擬してスタブする

public function myFunction($limit) 
{ 
    $this->doThing(); 
} 

private function doThing() 
{ 
    $result = $this->myModel 
     ->select('thing') 
     ->groupBy('name') 
     ->orderBy('count', 'desc') 
     ->get; 

    // do stuff with $result 
} 

だから私はテストで定義$stuffのコレクションとして$resultを出力し、完璧に動作し、私は

/** @test */ 
public function my_test() 
{ 
    $stuff = new Collection(['person1', 'person2', 'person3',]); 

    $myModelMock = m::mock(MyModel::class, [ 
     'select->groupBy->orderBy->get' => $stuff 
    ]); 

    App::instance(MyModel::class, $myModelMock); 
    $myOtherClass = App::make(OtherClassWhereMyModelIsInjectedAutomagically::class); 

    $myOtherClass->myFunction(); 
} 

を使用する電話をかけるモデルのメソッドをスタブに。

ただし、流暢なインターフェイス機能がであることを確認したい場合は、一度だけと呼びます。私は、これらの関数がプライベートメソッドの中で呼び出されていることを理解していますが、プライベート関数自体をテストしていないので、それは重要ではありません。それはもはや私のテストで$stuffデータに置き換えられていることを意味しない - 私は試してみて

/** @test */ 
public function query_ran_once() 
{ 
    $stuff = new Collection(['person1', 'person2', 'person3',]); 

    $myModelMock = m::mock(MyModel::class, [ 
     'select->groupBy->orderBy->get' => $stuff, 
     'where->update' => null, 
     'whereIn->update' => null 
    ]); 

    $myModelMock 
     ->shouldReceive('select->groupBy->orderBy->get') 
     ->times(1) 

    App::instance(MyModel::class, $myModelMock); 
    $myOtherClass = App::make(OtherClassWhereMyModelIsInjectedAutomagically::class); 

    $myOtherClass->myFunction(); 
} 

を使用する場合

は、だから私は$resultnullあるとされて終わるエラーが発生します。

モック期待が実行される前にスタブデータをどのように使用できますか?

答えて

2

あなたがここにandReturnを追加する必要があるので:

$collection = m::mock(\Illuminate\Database\Eloquent\Collection::class) 
$myModelMock 
    ->shouldReceive('select->groupBy->orderBy->get') 
    ->times(1) 
    ->andReturn($collection); 

この場合、それはCollectionまたはCollectionを嘲笑返すために良いことです。

+0

ありがとうございます。だから私は問題は、 '$ myModelMock'から返されるクラスは、デフォルトでコレクションではなく擬似オブジェクトのインスタンスであると仮定します。 – myol

+1

いいえ...問題は、空の値を返していたことでした –

+0

私は再度感謝を参照してください。 – myol

関連する問題