使用Mockery模拟Laravel Model :: increment()

时间:2015-01-28 09:58:48

标签: php laravel phpunit codeception mockery

我在Laravel 5事件处理程序中有一行代码,如下所示:

$this->event->batch->increment('attempted_jobs');

$this->event是调用处理程序的事件,$this->event->batch包含我的Batch模型。所有这些都会增加我数据库中的attempted_jobs列,所以这是相当基本的东西。

我希望能够测试这个事件处理程序,我正在使用Codeception和Mockery。我对$this->event->batch的模拟看起来像这样:

$batch = m::mock('MyVendor\MyApp\Batch');
$batch->shouldReceive('increment')->once()->with('attempted_jobs');

然而,这会导致问题 - increment()Model的受保护方法,因此无法进行模拟。这是确切的错误:

InvalidArgumentException: increment() cannot be mocked as it a protected method and mocking protected methods is not allowed for this mock

它似乎是使用__call() PHP魔术方法实现的,那么如何模仿这个呢?我试图创建一个__call()模拟器,但这会产生大量与increment()方法无关的错误。

1 个答案:

答案 0 :(得分:0)

问题是因为,如上所述,increment()Illuminate\Database\Eloquent\Model()的受保护方法。解决这个问题的方法是直接模拟__call()方法,如下所示:

$batch = m::mock('MyVendor\MyApp\Batch');
$batch->shouldReceive('__call')->with('increment')->once();

(我不确定为什么当我第一次尝试时这并不起作用)