嘲弄Laravel Eloquent模型 - 如何使用Mockery设置公共财产

mtm*_*ald 24 php laravel eloquent mockery

我想在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));
Run Code Online (Sandbox Code Playgroud)

...但是设置公共属性会返回以下错误:

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

模拟一个简单的类时不会返回此错误,但在我尝试模拟Eloquent模型时会返回此错误.我究竟做错了什么?

Joy*_*ful 14

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

$mock->shouldReceive('getAttribute')
    ->with('role')
    ->andReturn(2);
Run Code Online (Sandbox Code Playgroud)

如果你打电话,$user->role你会得到 - 2 ($user- 它的User模拟课)

  • 我正在获得未定义的属性:Mockery \ CompositeExpectation :: $ role (2认同)

Fan*_*_MD 6

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

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

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

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

  • 我收到错误“无法加载模拟 App\Models\User,类已存在”。 (3认同)

Old*_*dek 1

试过这个吗?它应该涵盖你的问题。

https://github.com/padraic/mockery/blob/master/docs/11-MOCKING-PUBLIC-PROPERTIES.md

我想说实施这些

protected $roles = array();

public function setRoles($roles)
{
    $this->roles = $roles;
}

public function addRole($role)
{
    $this->roles[] = $role;
}
Run Code Online (Sandbox Code Playgroud)

然后你可以使用以下方法进行测试:

$mock = Mockery::mock('User');
$mock->shouldReceive('hasRole')->once()->andReturn(true);
$mock->addRole(2);
$this->assertTrue(someTest($mock));
Run Code Online (Sandbox Code Playgroud)

这个后殿让您有机会在执行 getRoles() 时承诺一种格式,如果您执行 SOLID OOP,则该格式将是 Role 对象的数组,或者如果您更愿意使用数组,那么至少您知道它始终是您得到的数组。

  • 谢谢,但这不是只是改变 User 类的实现来添加 getter 和 setter 吗?虽然这可能是一种解决方法,但我不知道这如何回答最初的问题。 (6认同)
  • 是的,我已阅读此页面,但没有提供示例。当我尝试 set() 时,我得到 **BadMethodCallException:此模拟对象上不存在方法 Mockery_0_User::set() 。我真正要找的是一个例子。 (3认同)