Laravel 5 设置模拟雄辩模型的公共属性
我有一个Model1,它有许多Model2 Model1的一个实例作为参数传递给我要测试的函数。我想测试的函数如下所示: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
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 = new Model1();
$model1->setAttrbute('Model2s', array());
NULL
。您可以通过做以下两件事之一来避免这种情况:
$mock = $this->getMockBuilder('Model1')
->disableOriginalConstructor()
->setMethods(array('doSomeStuff', 'doSomeOtherStuff'))
->getMock();
$mock->setAttribute('Model2s', array());
$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将不会起任何作用。当你说它“不起作用”时,你能更具体一点你的意思吗?发生了什么,你希望它做什么?在提交答案之前,我只想确保我完全理解了问题:)