2016-07-22 7 views
0

私はModel2を多く含むModel1を持っています。擬似Eloquentモデルの公開属性を設定する

Model1のインスタンスは、テストしたい機能にパラメタとして渡されます。私がテストしたい機能は次のようになります:

function funnctionTotest(Model1 $moel1) 
{ 
    foreach($moel1->model2s as $model2) { 
    .... 
    } 
} 

以下の例は動作しません。私は実際のソリューションの出発点としてここに入れています(array()はModel2インスタンスのコレクションかもしれません)。 PHPUnitの中で、デフォルトでは、すべての嘲笑オブジェクトのメソッドは、彼らが何もしないとNULLを返す意味、スタブアウトされているので

$mock = $this->getMockBuilder('Model1') 
    ->disableOriginalConstructor() 
    ->getMock(); 
$mock->setAttribute('Model2s', array()); 

おかげ

+0

それはあなたがここで何をしようとして伝えるのは難しいです。 'setAttribute(string、array)'は何を行い、何をしようとしていますか?どのメソッドをスタブするのかを知らせずにModel1をモックすると、 'setAttribute'を含むすべてのメソッドがスタブされるので、' setAttribute'は何もしません。あなたが本当に 'setAttribute'を使う必要があるならば、Model1をまったく嘲笑せず、それを普通のようにインスタンス化するだけでよいでしょう。 – Ataraxia

+0

@Ataraxia、私の編集後に今すぐクリアされることを願っています –

+0

しかし、それを正常にインスタンス化するのではなく、Model1を嘲笑している理由はありますか?繰り返しますが、あなたがあなたの例で行ったようにメソッドを設定せずにモックした場合、あなたの呼び出しsetAttributeは何もしません。あなたはそれが "うまくいかない"と言ったときの意味についてもう少し具体的にすることはできますか?何が起こっているのか、そしてそれをやり遂げることを望んでいるのですか?回答を提出する前に問題を完全に理解していることを確認したいだけです:) – Ataraxia

答えて

0

は私のために完璧に機能するソリューションは以下のとおりです。

$campaignMock = $this->getMockBuilder('Model2') 
    ->disableOriginalConstructor() 
    ->setMethods(array('setAttribute', 'getAttribute')) 
    ->getMock(); 
$model2 = new Model2(); 
$model2->someprop = 'somevalue'; 
$campaignMock->expects($this->at(0)) 
    ->method('getAttribute') 
    ->with('model2s') 
    ->willReturn(array($model2)); 

おかげ

0
$mock->setAttribute('Model2s', array()); 

は何もしません。

  1. モックビルダーでスタブアウトする方法のリストを設定します。このリストに指定されていないメソッドは、デフォルトの機能を保持します。

    $mock = $this->getMockBuilder('Model1') 
    ->disableOriginalConstructor() 
    ->setMethods(array('doSomeStuff', 'doSomeOtherStuff')) 
    ->getMock(); 
    $mock->setAttribute('Model2s', array()); 
    
  2. 全くMODEL1を模擬しないでください - ちょうどMODEL1の通常のインスタンスとして、それをインスタンス化します。

    $model1 = new Model1(); 
    $model1->setAttrbute('Model2s', array()); 
    

実行するためのテストケースのための順序でMODEL1でスタブする必要は全く方法がない場合は、オプション#2が最も理にかなっています。ここで

関連する問題