Магические методы репозитория доктрины PHPUnit

Мне нужна помощь, чтобы полностью протестировать мой класс, который зависит от Doctrine.

У меня есть один метод в моем классе, который использует этот метод магияfindOneBy ... из Doctrine EntityRepository, как показано ниже:

Магические методы репозитория доктрины PHPUnit

Но когда я запускаю свой тест, у меня всегда появляется это предупреждение:

Магические методы репозитория доктрины PHPUnit

Как я могу высмеять этот призыв? Ниже я описал, как должен работать магический метод __call EntityManager:

Магические методы репозитория доктрины PHPUnit

как называется ваше поле или вы можете показать свою сущность?

Alessandro Minoccheri 13.03.2018 13:57

setMethods можно использовать для добавления методов к фиктивному объекту. phpunit.de/manual/current/en/test-doubles.html

Cerad 13.03.2018 14:14

Имя поля - $ idShopUrl, в коде выполнения все в порядке, ничего не сломано, но я хотел бы знать, как имитировать / протестировать его.

Guilherme Ferreira 13.03.2018 15:45
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Symfony Station Communiqué - 17 февраля 2023 г
Symfony Station Communiqué - 17 февраля 2023 г
Это коммюнике первоначально появилось на Symfony Station , вашем источнике передовых новостей Symfony, PHP и кибербезопасности.
Управление ответами api для исключений на Symfony с помощью KernelEvents
Управление ответами api для исключений на Symfony с помощью KernelEvents
Много раз при создании api нам нужно возвращать клиентам разные ответы в зависимости от возникшего исключения.
0
3
1 126
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Думаю, можно заменить волшебный метод findOneByXXXX ('идентификатор') на реальный метод findOneBy (array ('XXXX' => 'identifier')).

То есть:

$this->shopUrlRepository->findOneByIdShopUrl($this->shop->getId());

К:

$this->shopUrlRepository->findOneBy(array('IdShopUrl' => $this->shop->getId()));

Это настоящий метод. Документация доктрины

Я надеюсь это тебе поможет.

Оба случая действительны, но в этом сценарии для меня важно знать, как над ним издеваться :)

Guilherme Ferreira 13.03.2018 16:35
Ответ принят как подходящий

Вы можете имитировать магический метод __call, который вызывается при вызове недопустимых методов.

$mock
    ->expects($this->once())
    ->method('__call')
   ->with(
      $this->equalTo('findOneByIdShopUrl'), //
      $this->equalTo(['5'])
   )
   ->willReturn(['shop' => 'shop info']); // return shop object

Проверьте также http://php.net/manual/en/language.oop5.overloading.php#object.call

Другой вариант - использовать setMethods().

$this->getMockBuilder('ShopRepository')->setMethods(['findOneByShopId'])->getMock(); 

а затем остальная логика с такими методами, как воля, с т. д.

setMethods устарел. Предполагаемая функциональность теперь обеспечивается addMethods: github.com/sebastianbergmann/phpunit/pull/3687

jah 11.08.2020 22:32

Другие вопросы по теме