设置模拟 Eloquent 模型 public 属性
Set mocked Eloquent model public attributes
我有一个模型 Model1,它有很多 Model2。
Model1 的一个实例作为参数传递给了我要测试的函数。我想测试的功能如下所示:
function funnctionTotest(Model1 $moel1)
{
foreach($moel1->model2s as $model2) {
....
}
}
下面的示例不起作用。我把它放在这里作为真正解决方案的起点(array() 应该用其他东西代替,比如 Model2 实例的集合)。
$mock = $this->getMockBuilder('Model1')
->disableOriginalConstructor()
->getMock();
$mock->setAttribute('Model2s', array());
谢谢
$mock->setAttribute('Model2s', array());
不会做任何事情,因为在 PHPUnit 中,默认情况下,所有模拟对象的方法都被删除,这意味着它们什么都不做,return 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));
谢谢
我有一个模型 Model1,它有很多 Model2。
Model1 的一个实例作为参数传递给了我要测试的函数。我想测试的功能如下所示:
function funnctionTotest(Model1 $moel1)
{
foreach($moel1->model2s as $model2) {
....
}
}
下面的示例不起作用。我把它放在这里作为真正解决方案的起点(array() 应该用其他东西代替,比如 Model2 实例的集合)。
$mock = $this->getMockBuilder('Model1')
->disableOriginalConstructor()
->getMock();
$mock->setAttribute('Model2s', array());
谢谢
$mock->setAttribute('Model2s', array());
不会做任何事情,因为在 PHPUnit 中,默认情况下,所有模拟对象的方法都被删除,这意味着它们什么都不做,return 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));
谢谢