Laravel 5 设置模拟雄辩模型的公共属性

Laravel 5 设置模拟雄辩模型的公共属性,laravel-5,eloquent,phpunit,Laravel 5,Eloquent,Phpunit,我有一个Model1,它有许多Model2 Model1的一个实例作为参数传递给我要测试的函数。我想测试的函数如下所示: function funnctionTotest(Model1 $moel1) { foreach($moel1->model2s as $model2) { .... } } 下面的示例不起作用。我把它放在这里作为一个真正解决方案的起点(array()应该被其他东西(可能是Model2实例的集合)所取代) 谢谢 不会执行任何操作,因为在PHPU

我有一个Model1,它有许多Model2

Model1的一个实例作为参数传递给我要测试的函数。我想测试的函数如下所示:

function funnctionTotest(Model1 $moel1)
{
   foreach($moel1->model2s as $model2) {
     ....
   }
}
下面的示例不起作用。我把它放在这里作为一个真正解决方案的起点(array()应该被其他东西(可能是Model2实例的集合)所取代)

谢谢

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

  • 在模拟生成器中设置要存根的方法列表。此列表中未指定的任何方法都保留其默认功能

    $mock = $this->getMockBuilder('Model1')
     ->disableOriginalConstructor()
     ->setMethods(array('doSomeStuff', 'doSomeOtherStuff'))
     ->getMock();
    $mock->setAttribute('Model2s', array());
    
  • 根本不要模拟Model1——只是将其实例化为Model1的普通实例

     $model1 = new Model1();
     $model1->setAttrbute('Model2s', array());
    
  • 如果没有方法需要在Model1中存根才能运行测试用例,那么选项2最有意义

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

  • 在模拟生成器中设置要存根的方法列表。此列表中未指定的任何方法都保留其默认功能

    $mock = $this->getMockBuilder('Model1')
     ->disableOriginalConstructor()
     ->setMethods(array('doSomeStuff', 'doSomeOtherStuff'))
     ->getMock();
    $mock->setAttribute('Model2s', array());
    
  • 根本不要模拟Model1——只是将其实例化为Model1的普通实例

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

  • 如果没有方法需要在Model1中存根才能运行测试用例,那么选项#2最有意义。

    下面是一个非常适合我的解决方案:

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

    谢谢

    这是一个非常适合我的解决方案:

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

    谢谢

    很难说你想在这里做什么。
    setAttribute(string,array)
    做什么,您想用它做什么?如果您模拟Model1而不告诉它要存根的方法,那么它的所有方法,包括
    setAttribute
    ,都将被存根,因此
    setAttribute
    根本不做任何事情。如果你真的需要使用<代码> SETATEATION/CODE >,你可能想考虑不要嘲笑MOD1,只是将它实例化为“.@ Ataraxia,希望它在我的编辑之后有点被清除,但是有没有理由嘲弄MOD1而不是只是例示它?”同样,如果像在示例中那样模拟它而不设置任何方法,那么调用setAttribute将不会起任何作用。当你说它“不起作用”时,你能更具体一点你的意思吗?发生了什么,你希望它做什么?在提交答案之前,我只想确定我完全理解了这个问题:)很难说出你想在这里做什么。
    setAttribute(string,array)
    做什么,您想用它做什么?如果您模拟Model1而不告诉它要存根的方法,那么它的所有方法,包括
    setAttribute
    ,都将被存根,因此
    setAttribute
    根本不做任何事情。如果你真的需要使用<代码> SETATEATION/CODE >,你可能想考虑不要嘲笑MOD1,只是将它实例化为“.@ Ataraxia,希望它在我的编辑之后有点被清除,但是有没有理由嘲弄MOD1而不是只是例示它?”同样,如果像在示例中那样模拟它而不设置任何方法,那么调用setAttribute将不会起任何作用。当你说它“不起作用”时,你能更具体一点你的意思吗?发生了什么,你希望它做什么?在提交答案之前,我只想确保我完全理解了问题:)