Насмешка над моделью Laravel :: increment () с издевательством

У меня есть строка кода в обработчике событий 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() не реализован.


person edcs    schedule 28.01.2015    source источник


Ответы (1)


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

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

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

person edcs    schedule 20.04.2015