Подтвердить что ты не робот

Как издеваться над сервисом Symfony 2 в функциональном тесте?

У меня есть служба 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);
4b9b3361

Ответ 1

После создания ServiceA mock вам нужно передать его в клиентский контейнер (а не тот, который из ядра, потому что клиентский объект строит свое собственное ядро). Попробуйте следующее:

$client = self::createClient();

$serviceA = $this->getMockBuilder('ServiceA')
    ->disableOriginalConstructor()
    ->getMock();

$client->getContainer()->set('my_bundle.service.a', $serviceA);

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

Ответ 2

Вы не должны издеваться над тестированным классом, вы должны высмеять класс Redis и ввести его.

Если Redis не используется для этого теста, вам даже не нужно настраивать макет.

$redis = $this->getMockBuilder('Redis')->disableOriginalConstructor()->getMock();
$serviceA = new ServiceA($redis);

Ответ 3

Существует специальный инструмент, который заботится о насмеханных сервисах - https://github.com/ramunasd/symfony-container-mocks

Так легко:

$service = static::$kernel->getContainer()->prophesize('my.custom.service');

Ответ 4

Вы пробовали?

$serviceA = $this->getMock('ServiceA', array('getRequest'), array(), '', false);