Set mocked Eloquent模型公共属性

问题描述:

我有一个模型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

这里是完美的作品对我的解决方案:

$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)); 

感谢

$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是最有意义的方法。