嘲笑Laravel雄辩模型 - 如何使用Mockery设置公共属性

2022-08-30 14:01:07

我想在我的PHPUnit测试中使用模拟对象(Mockery)。模拟对象需要同时设置一些公共方法和一些公共属性。该课程是Laravel Eloquent模型。我试过这个:

$mock = Mockery::mock('User');
$mock->shouldReceive('hasRole')->once()->andReturn(true); //works fine
$mock->roles = 2; //how to do this? currently returns an error
$this->assertTrue(someTest($mock));

...但设置 public 属性会返回以下错误:

BadMethodCallException: Method Mockery_0_User::setAttribute() 在此模拟对象上不存在

此错误在模拟简单类时不返回,但当我尝试模拟 Eloquent 模型时返回。我做错了什么?


答案 1

如果要使用此值获取此属性,只需使用它:

$mock->shouldReceive('getAttribute')
    ->with('role')
    ->andReturn(2);

如果你打电话,你会得到 - ( - 它的模拟类)$user->role2$userUser


答案 2

这个答案有点晚了,但希望它能帮助别人。您当前可以使用'alias'关键字在模拟的 Eloquent 对象上设置静态属性:

$mocked_model = Mockery::mock('alias:Namespace\For\Model');
$mocked_model->foo = 'bar';
$this->assertEquals('bar', $mocked_model->foo);

这对于模拟外部供应商类(如某些 Stripe 对象)也很有用。

阅读“别名”和“重载”关键字:http://docs.mockery.io/en/latest/reference/startup_methods.html


推荐