2014-02-02 1 views
0

В моем контроллере я использую MyModel::where(...), который вызывает базу данных во время одного из моих тестов. Я думал, что смогу перегрузить его следующим, но он все еще запрашивает базу данных. Что я могу сделать, чтобы убедиться, что мой тест по-прежнему требует, чтобы вызывал ::where, но возвращает издеваемую модель, поэтому я могу возобновить тестирование остальной части этого метода контроллера?Не удалось высмеять Model :: where() и предотвратить тест из базы данных запросов

MyModel::shouldReceive('where') 
    ->once() 
    ->with('param1', 'param2') 
    ->andReturn($mockedModel); 

ответ

3

Прежде всего, вам нужно понять, почему вы не можете издеваться над методом where. Это потому, что класс Illuminate\Database\Eloquent\Model (Eloquent - его псевдоним) не имеет явно объявленного where. Этот метод вызван магическими методами __callStatic и __call и, по сути, является методом Illuminate\Database\Eloquent\Builder (sources).

Затем, у вас есть несколько вариантов:

  1. Вы можете принять назвать свою базу данных в тестах и ​​просто определить реальный контекст перед вашими утверждениями. Ваши тесты будут менее унитарными, но мы можем справиться с этим в большинстве случаев.

  2. @michaelcurry решение является хорошим. Вы можете создать свой собственный уровень абстракции с областями запросов или другой архитектурой (например, встраивать построитель запросов самостоятельно в модель), чтобы создать более тестируемый код.

  3. [никогда не пробовал] Вы можете издеваться над фасадом DB, чтобы полностью обойти базу данных. Вам нужно хорошее понимание ядра Laravel, но это может быть хороший способ написать «чистые» модульные тесты.

В любом случае, не стесняйтесь погружаться в исходный код Laravel. Код ясен, и очень немногие классы действительно важны. Это важно для того, чтобы действительно использовать силу структуры.

1

Используйте http://laravel.com/docs/eloquent#query-scopes и создайте новую функцию, которая просто вернет нужные данные.

Если вы еще не прочитали «Ларавел: от ученика к ремесленнику», я бы предложил его. Поможет вам понять, как все это структурировано.

+0

Отличное предложение для этого сценария ... но он все еще, кажется, попадает в базу данных. – Webnet