2015-01-28 4 views
2

У меня есть строка кода в обработчике событий Laravel 5, который выглядит следующим образом:Mocking Laravel Model :: прирост() с издевательством

$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 

Это, как представляется, реализовано с использованием PHP магического метода __call(), так как я дразнить это? Я попытался создать макет __call(), но это издает тонны ошибок, связанных с методом increment(), который не выполняется.

ответ

0

Проблема заключается в том, что, как указано, increment() является защищенным методом от Illuminate\Database\Eloquent\Model(). Способ обойти это издеваться метод __call() непосредственно, например, так:

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

(я не знаю, почему это не работает, когда я впервые попробовал это, хотя)