Прежде всего, вам нужно понять, почему вы не можете издеваться над методом where
. Это потому, что класс Illuminate\Database\Eloquent\Model
(Eloquent - его псевдоним) не имеет явно объявленного where
. Этот метод вызван магическими методами __callStatic
и __call
и, по сути, является методом Illuminate\Database\Eloquent\Builder
(sources).
Затем, у вас есть несколько вариантов:
Вы можете принять назвать свою базу данных в тестах и просто определить реальный контекст перед вашими утверждениями. Ваши тесты будут менее унитарными, но мы можем справиться с этим в большинстве случаев.
@michaelcurry решение является хорошим. Вы можете создать свой собственный уровень абстракции с областями запросов или другой архитектурой (например, встраивать построитель запросов самостоятельно в модель), чтобы создать более тестируемый код.
[никогда не пробовал] Вы можете издеваться над фасадом DB
, чтобы полностью обойти базу данных. Вам нужно хорошее понимание ядра Laravel, но это может быть хороший способ написать «чистые» модульные тесты.
В любом случае, не стесняйтесь погружаться в исходный код Laravel. Код ясен, и очень немногие классы действительно важны. Это важно для того, чтобы действительно использовать силу структуры.
Отличное предложение для этого сценария ... но он все еще, кажется, попадает в базу данных. – Webnet