提问者:小点点

Mockery无法使用雄辩模型填充方法创建部分模拟


我正在测试一个Laravel api。当我尝试使用雄辩的模型填充方法创建部分模拟时,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.

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

笔记:

我暂时用Model::更新方法解决了这个问题,而不是Model::fill,然后Model::保存,但是我仍然想知道如何模拟填充方法。

链接

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


共2个答案

匿名用户

我认为mock对象是创建的,但是没有这个方法。您需要为fill()方法定义一个期望值,以指示她的模拟行为。比如:

$mock->shouldReceive('fill')->once()->andReturn('ok');

希望能有帮助。

匿名用户

您也可以使用被动部分模拟:

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

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