【发布时间】:2014-05-19 12:08:17
【问题描述】:
我想在我的 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));
...但设置公共属性返回此错误:
BadMethodCallException:此模拟对象上不存在方法 Mockery_0_User::setAttribute()
模拟简单类时不会返回此错误,但当我尝试模拟 Eloquent 模型时会返回此错误。我做错了什么?
【问题讨论】:
-
也许是一个愚蠢的问题——但根据你测试的内容,你甚至需要一个模拟对象吗?如果您正在测试(比如说)hasRole() 方法,为什么不使用 $mock = new User; $模拟->角色= 2;并测试一下?例如 - 如果我正在测试访问器/演示者等,我将只是一个适当的对象而不是模拟 setAttribute 等。
-
@Apemantus 谢谢。我正在测试一个有关系的模型(一个用户有很多角色)。我不知道在不保存到数据库的情况下设置关系的方法。我正在尝试编写一个不需要接触数据库的测试。
-
好的。我没有测试我们的关系,但可以做 $mock->shouldReceive('setAttribute')->with('roles)->andReturn(2)- 但这只会返回整数。如果你想我猜你可以返回一个角色模型的第二个模拟,比如stackoverflow.com/questions/20361364/…
标签: php laravel eloquent mockery