Mockery无法使用Eloquent Model填充方法创建部分模拟

时间:2015-09-25 21:27:10

标签: unit-testing laravel laravel-5 mockery

我正在尝试测试Laravel api。 当我尝试使用Eloquent Model填充方法创建部分模拟时,phpunit会抛出错误。

代码

$mock = m::mock('App\User', [])->makePartial();
$mock->shouldReceive('fill')->once()->andReturn('ok');
$result = $mock->fill([]);
var_dump($result);

错误

PHP Fatal error:  Call to a member function __call() on a non-object
PHP Fatal error:  Uncaught exception 'Illuminate\Contracts\Container\BindingResolutionException' with message 'Target [Illuminate\Contracts\Debug\ExceptionHandler] is not instantiable.

我真的不知道这是一个雄辩的错误,还是一个Mockery错误。

注意:

我使用Model :: update方法而不是Model :: fill然后使用Model :: save暂时解决了这个问题,但我仍然想知道如何模拟fill方法。

链接

http://laravel.com/api/5.0/Illuminate/Database/Eloquent/Model.html#method_fill

2 个答案:

答案 0 :(得分:1)

我认为模拟对象是在没有这种方法的情况下创建的。您需要定义fill()方法的期望来指示她的模拟行为。像:

$mock->shouldReceive('fill')->once()->andReturn('ok');
希望它有所帮助。

答案 1 :(得分:0)

您还可以将被动局部模拟用作:

$mock = m::mock('Model')->makePartial();
$mock->shouldReceive("fill")->once()->andReturn("ok");

在被动局部中,除非方法调用与已知期望匹配,否则所有方法都将简单地推迟到父类原始方法。它将跳过模型构造函数中意外fill方法的调用。