2016-07-22 71 views
0

我有一個模型Model1,它有很多Model2。Set mocked Eloquent模型公共屬性

模型1的一個實例作爲參數傳遞給我想要測試的功能。我想要測試的功能如下所示:

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. 不要嘲笑型號1在所有 - 只是它實例作爲模型1的正常實例。

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

如果沒有需要在模型1至存根,以便你的測試用例來運行,選項#2是最有意義的方法。