设置模拟的Eloquent模型公共属性

时间:2016-07-22 21:38:31

标签: laravel-5 eloquent phpunit

我有一个Model1,它有很多Model2。

Model1的一个实例作为一个paramer传递给我想要测试的函数。我想测试的功能如下:

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

以下示例不起作用。我把它放在这里作为真正解决方案的起点(array()应该被其他东西替换,可能是Model2实例的集合。)

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

由于

2 个答案:

答案 0 :(得分:0)

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

不会做任何事情,因为在PHPUnit中,默认情况下,所有模拟对象的方法都被删除,这意味着它们什么都不做并返回NULL。你可以通过做以下两件事之一来避免这种情况:

  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());
    
  3. 如果没有方法需要在Model1中存根以便运行测试用例,那么选项#2最有意义。

答案 1 :(得分: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));

由于