У меня есть служба symfony, которая использует redis-соединение в некоторых методах, но не во всех методах.
class ServiceA { private $redis; public function __construct($redis) { $this->redis = $redis; } public function getRequest($param1, $param2) { $result = $param1+ $param2; return $request; } .. other methods which use $redis connection }
Я пишу функциональный тест для кода, который использует только метод getRequest (этот метод не нуждается в повторном соединении), но поскольку конструктор принимает соединение в качестве аргумента, когда я запускаю тест, он пытался подключить сервер redis.
Как я могу написать mock-службу, которая вообще не использует redis-соединение, и игнорировать оригинальный конструктор.
Я пытаюсь использовать подход, упомянутый ниже, но без успеха. Он по-прежнему пытается связать redis, хотя я отключил исходный конструктор.
http://blog.lyrixx.info/2013/04/12/symfony2-how-to-mock-services-during-functional-tests.html
$serviceA = $this->getMockBuilder('ServiceA') ->disableOriginalConstructor() ->getMock(); static::$kernel->getContainer()->set('my_bundle.service.a', $serviceA);
После того, как вы создадите макет ServiceA
, вам необходимо передать его в контейнер клиента (а не тот, который из ядра, потому что клиентский объект строит свое собственное ядро). Попробуй это:
$client = self::createClient(); $serviceA = $this->getMockBuilder('ServiceA') ->disableOriginalConstructor() ->getMock(); $client->getContainer()->set('my_bundle.service.a', $serviceA);
Обратите внимание, что вы должны вводить эту издеваемую службу каждый раз, когда вы делаете запрос. Это связано с тем, что клиент перестраивает ядро между двумя запросами.
Вы не должны издеваться над вашим тестированным классом, вы должны высмеять класс Redis и ввести его.
Если Redis не используется для этого теста, вам даже не нужно настраивать макет.
$redis = $this->getMockBuilder('Redis')->disableOriginalConstructor()->getMock(); $serviceA = new ServiceA($redis);
Существует специальный инструмент, который заботится о насмеханных сервисах – https://github.com/ramunasd/symfony-container-mocks
Это легко:
$service = static::$kernel->getContainer()->prophesize('my.custom.service');
Ты пробовал ?
$serviceA = $this->getMock('ServiceA', array('getRequest'), array(), '', false);