如何在功能测试中模拟Symfony 2服务?

2022-08-30 14:46:24

我有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连接),但是由于构造函数将连接作为参数,因此当我运行测试时,它尝试连接redis服务器。

我怎么能写出根本不使用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);

答案 1

创建 mock 后,您需要将其传递到客户端的容器(而不是内核中的容器,因为客户端对象会构建自己的内核)。试试这个:ServiceA

$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);

推荐